我是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']]]
答案 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))