Python:更易读的列表理解

时间:2014-02-07 09:03:11

标签: python list-comprehension string-algorithm

我是Python新手。我有以下代码,它是我正在开发的字符串算法的一部分。

>>> newlist=[]
>>> i =0

>>> for x in range(len(list1)):
       new_item = [y for y in list1[i] if y not in list2[i]]
       newlist.append(new_item)
       i=i+1

>>> print newlist

我喜欢使用列表理解来实现这一点,因为我读过它是性能优化的。有人可以建议我一个方法。

谢谢。

[编辑]

示例:

list1= [[['pat'],['cut'],['rat']],  [['sat','pat'],['cut','pat']],[['instructor','plb','error0992'],['instruction','address','00x0993'],['data','address','017x112']]

list2= [[['pat'], ['cut'], ['rat']], [['sat', 'pat']], [['instructor', 'plb', 'error0992'], ['instruction', 'address', '00x0993']]]

所以新列表,

newlist= [[], [['cut', 'pat']], [['data', 'address', '017x112']]]

3 个答案:

答案 0 :(得分:3)

如果您只想要一个列表中的所有元素而不是另一个列表,我建议您查看python set。它们不允许重复,但性能和可读性的好处很大。

您可以这样实现:

newlist = list(set(list1).difference(set(list2)))

如果您想应用此代替当前解决方案,您应该按照Dominic建议的方式做一些事情(为了便于阅读而略微编辑):

[list(set(a)-set(b)) for a, b in zip(list1, list2)]

如果订单很重要,或者你有重复,那么你上面的单个列表理解应该做的伎俩,只需将其包装为lambda函数,使其更具可读性:

single_item = lambda i: [y for y in list1[i] if y not in list2[i]]
newlist = [single_item(i) for i in enumerate(list1)]

答案 1 :(得分:2)

这是一个嵌套的列表解析,与您的代码完全相同(尽管不会保留i的值)。

newlist = [[y for y in list1[i] if y not in list2[i]] for i in range(len(list1))]

答案 2 :(得分:1)

TL; DR: [[y for y in list1[i] if j not in list2[i]] for i in enumerate(list1)]

您应该使用enumerate代替range(len())非成语。您可能还想考虑将其设为生成器表达式。使用具体的嵌套列表:

([y for y in list1[i] if j not in list2[i]] for i in enumerate(list1))

是不是

((y for y in list1[i] if j not in list2[i]) for i in enumerate(list1))