2017-09-27 79 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