liste kavrayışında if / else


Yanıtlar:


1459

Bunu tamamen yapabilirsiniz. Bu sadece bir sipariş meselesi:

[unicode(x.strip()) if x is not None else '' for x in row]

Genel olarak,

[f(x) if condition else g(x) for x in sequence]

Ayrıca, ifyalnızca koşulları içeren liste anlaşmaları için,

[f(x) for x in sequence if condition]

Bu aslında farklı bir dil yapısı, bir kullandığı Not koşullu ifadeyi kendisi bir parçası değildir, anlama sözdizimi iken, ifsonra for…inListe tanımları parçasıdır ve kullanılan filtre kaynağından iterable gelen elemanları.


Koşullu ifadeler, bir koşula bağlı olarak iki ifade değeri arasında seçim yapmak istediğiniz her türlü durumda kullanılabilir. Bu, diğer dillerde var olan üçlü operatörle?: aynı şeyi yapar . Örneğin:

value = 123
print(value, 'is', 'even' if value % 2 == 0 else 'odd')

141
Burada if / else ifadesinin artık "üçlü operatör" sözdizimi olduğunu ve kavrama sözdizimini listelemediğini unutmayın.
Adam Vandenberg

8
Bu yüzden üçlü operatörü parantez içine almayı tercih ediyorum, bunun bir anlama değil, sadece normal bir ifade olduğunu daha açık hale getiriyor.
Jochen Ritzel

17
Yani hile "daha önce eğer o zaman ben de başka bir bölüm eklemek zorunda yazarken liste sıkıştırma." benim çünkü eğer l = [ 2, 3, 4, 5]o zaman [x if x % 2 == 0 for x in l]bana oysa hata vermek [x if x % 2 == 0 else 200 for x in l]işler. Evet filtrelemeyi biliyorum yazmalıyım [ x for x in l if x % 2 == 0]. Botheration için üzgünüm. Cevabınız için teşekkürler.
Grijesh Chauhan

5
Piton dokümanlar üçlü operatörü söz . Başka bir şey gerektirdiğini veya çalışmadığını unutmayın.
naught101

4
@Drewdin List anlamaları, yinelemesi sırasında kırılmayı desteklemez. O zaman normal bir döngü kullanmanız gerekecektir.
dürtmek

44

Tek yön:

def change(f):
    if f is None:
        return unicode(f.strip())
    else:
        return ''

row = [change(x) for x in row]

Her ne kadar o zaman var:

row = map(change, row)

Veya bir lambda satır içi kullanabilirsiniz.


13
Bu ayrıca, ififadesinin veya kodunun veya elses deyimi bloğundaki olası istisnaları işlemeniz gerektiğinde kullanılacak iyi (yalnızca) bir tekniktir . Kabul edilen cevap basit durumlar için daha iyidir.
martineau

37

İşte başka bir açıklayıcı örnek:

>>> print(", ".join(["ha" if i else "Ha" for i in range(3)]) + "!")
Ha, ha, ha!

Fonksiyon tarafından üretilen diğer tüm değerler için ve bu değer için if ideğerlendirilen gerçeği kullanır . Bu nedenle liste kavraması şu şekilde değerlendirilir:False0Truerange()

>>> ["ha" if i else "Ha" for i in range(3)]
['Ha', 'ha', 'ha']

37

Özel problem önceki cevaplarda zaten çözülmüştür, bu yüzden liste kavrayışlarında koşullu kullanım genel fikrine değineceğim.

Koşulların bir liste kavrayışı içinde nasıl yazılabileceğini gösteren bir örnek:

X = [1.5, 2.3, 4.4, 5.4, 'n', 1.5, 5.1, 'a']     # Original list

# Extract non-strings from X to new list
X_non_str = [el for el in X if not isinstance(el, str)]  # When using only 'if', put 'for' in the beginning

# Change all strings in X to 'b', preserve everything else as is
X_str_changed = ['b' if isinstance(el, str) else el for el in X]  # When using 'if' and 'else', put 'for' in the end

İlk liste kavrayışında X_non_strsiparişin:

ifadesi için öğenin içinde iterable eğer koşul

ve son liste kavrayışında X_str_changed, sıra:

deyim1 eğer durum başka ifade2 için öğenin içinde iterable

Hep zor olduğunu hatırlamak bulmak expresseion1 önce olmak zorunda olmadığını ve expression2 sonra olmak zorundadır başka . Kafam her ikisinin de önce ya da sonra olmasını istiyor.

Ben tasarlanmıştır tahmin gibi normal dil, örneğin benzer çünkü "Ben içeride kalmasını istediğimi eğer yağmur yağdığında, başka ben dışını gitmek istiyorum"

Sade ingilizce yukarıda belirtilen iki tür liste kavrayışı şu şekilde ifade edilebilir:

Sadece if:

extract_apple için elma içinde box_of_apples eğer apple_is_ripe

Ve birlikte if/else

mark_apple eğer apple_is_ripe başka leave_it_unmarked için elma içinde box_of_apples


7

Diğer çözümler, bir büyük tek if/ elseyapısı. Bununla birlikte, liste kavrayışlarındaki üçlü ifadelerin okunması tartışmalıdır.

Bir işlev kullanmak okunabilirliğe yardımcı olur, ancak böyle bir çözümün eşlemenin bir girdi olduğu bir iş akışında genişletilmesi veya uyarlanması zordur. Bir sözlük bu endişeleri azaltabilir:

row = [None, 'This', 'is', 'a', 'filler', 'test', 'string', None]

d = {None: '', 'filler': 'manipulated'}

res = [d.get(x, x) for x in row]

print(res)

['', 'This', 'is', 'a', 'manipulated', 'test', 'string', '']

1

Liste kavrayışının nasıl yapıldığıyla ilgilidir.

Aşağıdakileri unutmayın:

[ expression for item in list if conditional ]

Şuna eşittir:

for item in list:
    if conditional:
        expression

Nerede expressionbiraz farklı bir formatta olduğu (konuyu anahtarlama ve bir cümlede emir fiil düşünün).

Bu nedenle, kodunuz [x+1 for x in l if x >= 45]bunu yapar:

for x in l:
    if x >= 45:
        x+1

Ancak, bu kod [x+1 if x >= 45 else x+5 for x in l]bunu (yeniden düzenledikten sonra expression) yapar:

for x in l:
    if x>=45: x+1
    else: x+5

0

Eğer / then / else üçlü değerine ihtiyaç yoktur. Bence sorunuz şu cevabı gerektiriyor:

row = [unicode((x or '').strip()) for x in row]

0

Yinelenebilir bir öğedeki öğelerden liste oluşturma

Sorulara özel cevaplar vermek yerine öncelikle tüm olası formları genelleştirmek en iyisidir. Aksi takdirde okuyucu cevabın nasıl belirlendiğini bilemez. İşte son formda başka bir son maddenin kullanılabileceğine karar vermeye çalışan bir baş ağrım olmadan önce düşündüğüm birkaç genel form.

[expression1(item)                                        for item in iterable]

[expression1(item) if conditional1                        for item in iterable]

[expression1(item) if conditional1 else expression2(item) for item in iterable]

[expression1(item) if conditional1 else expression2(item) for item in iterable if conditional2]

Değerinin itemherhangi bir koşullu cümlesinde kullanılması gerekmez. A conditional3, çıkış listesine bir değer eklemek veya eklemek için bir anahtar olarak kullanılabilir.

Örneğin, orijinal dizeler listesinden boş dizeleri veya boşluk dizelerini ortadan kaldıran yeni bir liste oluşturmak için:

newlist = [s for s in firstlist if s.strip()]

1
İkincisi, Tim'in yorumunda cevap verdiği gibi bir hata verir , ayrıca python belgelerindeki koşullu ifadelere bakın . Bunlar benim için oldukça okunaksız. Özet: yalnızca this if condition else thatveya normal ifadeye izin verilir. Değil value = this if condition(bununla başarılabilir value = this if condition else None)
Anderium

0

Koşullu mantığı bir anlamada birleştirebilirsiniz:

 ps = PorterStemmer()
 stop_words_english = stopwords.words('english')
 best = sorted(word_scores.items(), key=lambda x: x[1], reverse=True)[:10000]
 bestwords = set([w for w, s in best])


 def best_word_feats(words):
   return dict([(word, True) for word in words if word in bestwords])

 # with stemmer
 def best_word_feats_stem(words):
   return dict([(ps.stem(word), True) for word in words if word in bestwords])

 # with stemmer and not stopwords
 def best_word_feats_stem_stop(words):
   return dict([(ps.stem(word), True) for word in words if word in bestwords and word not in stop_words_english])

-2
# coding=utf-8

def my_function_get_list():
    my_list = [0, 1, 2, 3, 4, 5]

    # You may use map() to convert each item in the list to a string, 
    # and then join them to print my_list

    print("Affichage de my_list [{0}]".format(', '.join(map(str, my_list))))

    return my_list


my_result_list = [
   (
       number_in_my_list + 4,  # Condition is False : append number_in_my_list + 4 in my_result_list
       number_in_my_list * 2  # Condition is True : append number_in_my_list * 2 in my_result_list
   )

   [number_in_my_list % 2 == 0]  # [Condition] If the number in my list is even

   for number_in_my_list in my_function_get_list()  # For each number in my list
]

print("Affichage de my_result_list [{0}]".format(', '.join(map(str, my_result_list))))

(venv) $ python list_comp.py
Affichage de my_list [0, 1, 2, 3, 4, 5]
Affichage de my_result_list [0, 5, 4, 7, 8, 9]

Yani, sizin için: row = [('', unicode(x.strip()))[x is not None] for x in row]


Ne yok "Affichage de ..." demek? Fransız mı?
Peter Mortensen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.