Yanıtlar:
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, if
yalnı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, if
sonra for…in
Liste 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')
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.
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.
if
ifadesinin veya kodunun veya else
s 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.
İş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 i
değerlendirilen gerçeği kullanır . Bu nedenle liste kavraması şu şekilde değerlendirilir:False
0
True
range()
>>> ["ha" if i else "Ha" for i in range(3)]
['Ha', 'ha', 'ha']
Ö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_str
sipariş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
Diğer çözümler, bir büyük tek if
/ else
yapı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', '']
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 expression
biraz 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
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 item
herhangi 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()]
this if condition else that
veya normal ifadeye izin verilir. Değil value = this if condition
(bununla başarılabilir value = this if condition else None
)
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])
# 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]