2017-09-27 95 views
1

列表理解我有這樣的代碼:蟒蛇3 if語句引用列表

xtralist = ["df","cvbcb","df"] 
kont=[] 
b = Counter(xtralist) 
for item in xtralist: 
    if item not in kont: 
     print(b[item] 
     kont.append(item) 

kont列表只那裏看看,如果該項目在打印之前已經完成。它的工作原理,但對於大xtralist太慢了,所以我想這:

[(print(b[item] and kont.append(item)) for item in xtralist if item not in kont] 

它不工作。我確信有更聰明的方法,但我怎麼能用列表理解來做到這一點?

+0

也許你的'kont'應該是一個集合而不是一個列表。集合檢查遏制的速度要快得多。 – khelwood

+0

你的大括號似乎也有問題......還查找三元運算符來幫助你打印語句 – user3012759

+0

'和'是一個邏輯運算符,所以'print(b [item]和kont.append(item)) '試圖打印一個'bool'。此外,您不應該在列表理解中執行語句(如'print')。 –

回答

0

所有你需要做的是附上xtralistset,使其沒有任何重複的元素,然後只printset每個項目:

xtralist = ["df", "cvbcb", "df"] 
print('\n'.join(set(xtralist))) 

DF
cvbcb

要挖入代碼一點點,檢查出各步驟:

>>> xtralist = ["df", "cvbcb", "df"] 
>>> xtralist 
['df', 'cvbcb', 'df'] 
>>> set(xtralist) 
{'df', 'cvbcb'} 
>>> '\n'.join(set(xtralist)) 
'df\ncvbcb' 
>>> print('\n'.join(set(xtralist))) 
df 
cvbcb 

但是,請注意,set是無序的,因此,如果順序很重要,你必須通過你的列表迭代;對你所嘗試的東西稍作修改即可;你並不需要一個Counter都:

xtralist = ["df", "cvbcb", "df"] 
kont = [] 
for item in xtralist: 
    if item not in kont: 
     print(item) 
     kont.append(item) 

DF
cvbcb

0

set確實是要走的路。如果訂單雖然很重要,你需要使用一個List和Set:

xtralist = ["df","cvbcb","df"] 
already_seen = set() 
for item in xtralist: 
    if item not in already_seen: 
     print(item) 
     already_seen.add(item) 

它輸出:

df 
cvbcb 

如果你想顯示出現次數的數量,你可以修改你代碼咯:

from collections import Counter 
xtralist = ["df","cvbcb","df"] 
kont = set() 
b = Counter(xtralist) 
for item in xtralist: 
    if item not in kont: 
     print("%s * %d" % (item, b[item])) 
     kont.add(item) 

它輸出:

df * 2 
cvbcb * 1