Python'da liste kavrama döngüleri için iki çerçeveleme


107

Aşağıdaki gibi iki listem var

tags = [u'man', u'you', u'are', u'awesome']
entries = [[u'man', u'thats'],[ u'right',u'awesome']]

Girişleri entriesiçinde bulundukları zamandan çıkarmak istiyorum tags:

result = []

for tag in tags:
    for entry in entries:
        if tag in entry:
            result.extend(entry)

İki döngüyü tek satırlık liste anlayışı olarak nasıl yazabilirim?


3
itertools.chainDüzleştirilmiş bir liste istiyorsanız kullanın :list(chain.from_iterable(entry for tag in tags for entry in entries if tag in entry))
Ashwini Chaudhary

Yanıtlar:


146

Bunu yapmalı:

[entry for tag in tags for entry in entries if tag in entry]

164

Bunu hatırlamanın en iyi yolu, liste kavrama içindeki döngü sırasının, geleneksel döngü yaklaşımında göründükleri sıraya dayanmasıdır. En dıştaki döngü önce gelir ve ardından iç döngüler daha sonra gelir.

Yani, eşdeğer liste anlayışı şöyle olacaktır:

[entry for tag in tags for entry in entries if tag in entry]

Genelde if-elseifade ilk for döngüsünden önce gelir ve eğer sadece bir ififadeniz varsa , sonunda gelir. Örneğin, boş bir liste eklemek tagistiyorsanız, girişte değilse, şu şekilde yaparsınız:

[entry if tag in entry else [] for tag in tags for entry in entries]

6

Uygun LC,

[entry for tag in tags for entry in entries if tag in entry]

LC'deki döngülerin sırası, iç içe döngülerdekilere benzer, if ifadeleri sona gider ve koşullu ifadeler başlangıçta gider.

[a if a else b for a in sequence]

Demoyu görün -

>>> tags = [u'man', u'you', u'are', u'awesome']
>>> entries = [[u'man', u'thats'],[ u'right',u'awesome']]
>>> [entry for tag in tags for entry in entries if tag in entry]
[[u'man', u'thats'], [u'right', u'awesome']]
>>> result = []
    for tag in tags:
        for entry in entries:
            if tag in entry:
                result.append(entry)


>>> result
[[u'man', u'thats'], [u'right', u'awesome']]

DÜZENLE - Sonucun düzleştirilmesi gerektiğinden, benzer bir liste anlayışı kullanabilir ve ardından sonuçları düzleştirebilirsiniz.

>>> result = [entry for tag in tags for entry in entries if tag in entry]
>>> from itertools import chain
>>> list(chain.from_iterable(result))
[u'man', u'thats', u'right', u'awesome']

Bunu birbirine ekleyerek, yapabilirsin

>>> list(chain.from_iterable(entry for tag in tags for entry in entries if tag in entry))
[u'man', u'thats', u'right', u'awesome']

Burada bir liste anlama yerine bir üreteç ifadesi kullanıyorsunuz. (79 karakter sınırına da mükemmel uyum sağlar ( listçağrı olmadan ))


2
tags = [u'man', u'you', u'are', u'awesome']
entries = [[u'man', u'thats'],[ u'right',u'awesome']]

result = []
[result.extend(entry) for tag in tags for entry in entries if tag in entry]

print(result)

Çıktı:

['man', 'thats', 'right', 'awesome']

0

Anlaşılırsa, yuvalanmış listeler yinelemesi döngüler için imbricated eşdeğeriyle aynı sırayı izlemelidir.

Anlamak için NLP'den basit bir örnek alacağız. Her cümlenin bir kelime listesi olduğu bir cümle listesinden tüm kelimelerin bir listesini oluşturmak istiyorsunuz.

>>> list_of_sentences = [['The','cat','chases', 'the', 'mouse','.'],['The','dog','barks','.']]
>>> all_words = [word for sentence in list_of_sentences for word in sentence]
>>> all_words
['The', 'cat', 'chases', 'the', 'mouse', '.', 'The', 'dog', 'barks', '.']

Tekrarlanan kelimeleri kaldırmak için liste [] yerine {} kümesi kullanabilirsiniz

>>> all_unique_words = list({word for sentence in list_of_sentences for word in sentence}]
>>> all_unique_words
['.', 'dog', 'the', 'chase', 'barks', 'mouse', 'The', 'cat']

veya uygula list(set(all_words))

>>> all_unique_words = list(set(all_words))
['.', 'dog', 'the', 'chases', 'barks', 'mouse', 'The', 'cat']

0
return=[entry for tag in tags for entry in entries if tag in entry for entry in entry]

6
Merhaba ve Stack Overflow'a hoş geldiniz! Lütfen sadece kod değil, bir açıklama gönderin.
Evelyn

1
Merhaba! Bu kod soruyu çözebilirken, sorunun nasıl ve neden çözüldüğüne dair bir açıklama da dahil olmak üzere , gönderinizin kalitesini artırmaya gerçekten yardımcı olur ve muhtemelen daha fazla oy almanıza neden olur. Sadece şimdi soran kişi için değil, gelecekte okuyucular için soruyu yanıtladığınızı unutmayın. Açıklamalar eklemek ve hangi sınırlamaların ve varsayımların geçerli olduğuna dair bir gösterge vermek için lütfen yanıtınızı düzenleyin .
Brian
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.