0

我是 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']]]
4

3 回答 3

3

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

你可以这样实现:

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)]
于 2014-02-07T09:10:07.090 回答
2

这是一个嵌套列表推导,与您的代码执行相同的操作(尽管不会保留 的值i)。

newlist = [[y for y in list1[i] if y not in list2[i]] for i in range(len(list1))]
于 2014-02-07T09:08:59.313 回答
1

TL;博士: [[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))

于 2014-02-07T09:20:11.677 回答