Tamsayılar listesi üzerinde yineleme ve bir koşula bağlı olarak öğeleri birleştirme

0

Soru

Tamsayıların bir listesini yinelemeye ve python standart kitaplığını kullanan bir koşula göre onlara katılmaya çalışıyorum. Örneğin, şöyle görünen tamsayıların bir listesi var:

listOfIntegers = [0, 0, 0, 2, 0, 4, 6, 0, 8, 0, 0, 0, 1, 9]

Bu listeyi yinelemek ve sonuçları formun bir dizesi olacak şekilde değerleri birleştirmek istiyorum:

result = '000-20-4-60-8000-1-9'

(kısa çizgilerin dahil olduğu yer). Bunun koşulu, önceki sayı sıfıra eşit değilse, önüne bir çizgi yerleştirilmesi gerektiğidir. Bir sonraki değer sıfıra eşitse, ondan önceki değerin sonuna birleştirilir.

integer iteration list python
2021-11-23 03:49:53
4

En iyi cevabı

2

Bu yardımcı olur: (Verilen listede sayıların pozitif olduğu düşünülürse)

def join(lst):
    return "".join(list(map(lambda x: str(-x), lst))).lstrip('-')

listOfIntegers = [0, 0, 0, 2, 0, 4, 6, 0, 8, 0, 0, 0, 1, 9]
print(join(listOfIntegers)) # 000-20-4-60-8000-1-9

İşleyiş:

  1. Her öğeyi negatife dönüştürün;:
    • 9 oluyor -9
    • 0 gibi bir etkisi yoktur -0 oluyor 0 python'da
  2. Sonra bunları dizelere dönüştürün ve onlara katılın
  3. Sondaki kaldırdığınızdan emin olun hyphen bizim durumumuzda lstrip('-') bu konuda bize yardımcı olur.
2021-11-23 04:48:25

Lütfen ne yaptığınızı ve neden işe yaradığını not edin. Bu, daha sonra bu sayfaya rastlayabilecek başkaları için daha iyi hale getirir.
krmogi

Cevabınız ek destekleyici bilgilerle geliştirilebilir. Başkalarının cevabınızın doğru olduğunu onaylayabilmesi için lütfen alıntılar veya belgeler gibi daha fazla ayrıntı eklemek üzere düzenleme yapın. İyi yanıtların nasıl yazılacağı hakkında daha fazla bilgiyi yardım merkezi'nde bulabilirsiniz.
Community
1

Basit bir yaklaşım, tamsayılar listesinden bir dize oluşturma ve ardından basit bir regex değiştirme:

listOfIntegers = [1, 0, 0, 2, 0, 4, 6, 0, 8, 0, 0, 0, 1, 9]
inp = ''.join([str(x) for x in listOfIntegers])
result = re.sub(r'(?<=.)(?=[^\D0])', '-', inp)
print(result)  # 100-20-4-60-8000-1-9
2021-11-23 04:07:00

Birleştirme, başkalarının buna benzer sorunları çözmek için yaptıklarını buldum. Aslında buna çok benzer bir çözüm gördüğüme eminim. Bahsetmeyi başaramadığım bir ayrıntı, bu tamsayılar listesindeki değerlerin 0-9 arasında herhangi bir değere değişme yeteneğine sahip olmasıdır. Listenin ikinci girişi şimdi 1 ise ne olur. birleştirme işlemini otomatikleştirmek için zaten var mı, böylece sonuç şimdi #0-10-20-4-60-8000-1-9 olur mu
42Dugg

@Dugg Başka bir cevapla güncelledim.
Tim Biegeleisen

Bu, yukarıdaki başka bir cevabın yanı sıra harika çalışır, ancak liste, listenin ilk girişi şimdi 1 olacak şekilde değiştirilirse, sonuç şu şekildedir #-100-20-4-60-8000-1-9 ne yazık ki en başında bir çizginin yerleştirildiği yer. Bunu, sonucun #100-20-4-60-8000-1-9 olacağı şekilde ortadan kaldırmanın bir yolu var mı? Ayrıca bu konuda şimdiye kadar çok yardımcı oldunuz. teşekkür ederim!
42Dugg

@42Dugg Güncellenmiş cevabı kontrol edin. Tire işaretlerinin yalnızca ilki dışındaki karakterler için eklendiğini iddia eden olumlu bir görünüm ekleyebiliriz.
Tim Biegeleisen
0

İşte basit bir çözüm:

listOfIntegers = [0, 0, 0, 2, 0, 4, 6, 0, 8, 0, 0, 0, 1, 9]

for i in listOfIntegers:
    if i != 0:
        print("-" + str(i), end="")
    else:
        print(str(i), end="")

Listedeki her öğe için, öğenin 0'a eşit olup olmadığını kontrol ederiz. 0'a eşit değilse, öğeyi önünde bir çizgi ile yazdırırız ve end yeni satırlardan kaçınmak için parametre. 0 İse, sadece öğeyi yazdırırız.

2021-11-23 04:35:53
0

Bir döngü kullanma:

def func(nums):
    result = ''
    for i, num in enumerate(nums):
        if num != 0 and i != 0:
            result += '-'
        result += str(num)
    return result
2021-11-23 03:55:07

Bu harika sonuç verir, ancak liste listenin ilk girişi şimdi 1 olacak şekilde değiştirilirse sonuç şu şekildedir: #-100-20-4-60-8000-1-9 ne yazık ki en başında bir çizginin yerleştirildiği yer. Bunu, sonucun #100-20-4-60-8000-1-9 olacağı şekilde ortadan kaldırmanın bir yolu var mı? Teşekkürler!
42Dugg

Edge davasını kaçırdığım için özür dilerim. İlk sayıyı atlamak için bir koşul ekleyebiliriz. Kodu buna göre düzenledim.
Tyler Liu

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................