我正在比较两个列表,以查找是否已将新数据添加到数据库' polo'。
最初这些名单采用相同的形式,但现在' excel'需要一个伴随的坐标来衡量它的价值。这是这个原始的LC:
[x for x in polo_list if x not in excel]
我很高兴听到我们能够解决这个问题的不同方法(也许我采取了错误的方法),现在这里是代码示例:
excel = [ ['a','a4'],['b','z4']]
polo = ['a','b','d']
a = [x for x in polo if x not in excel]
print 'new data! ', a
#should print,'new data!' ['d']
感谢您的时间
编辑:啊,幻想!它现在看起来如此简单!谢天谢地stackoverflow社区,我freakin'喜欢这个网站答案 0 :(得分:4)
只需搜索另一种理解:
a = [x for x in polo if x not in [item[0] for item in excel]]
最好事先保存这些值:
excel_first = [item[0] for item in excel]
a = [x for x in polo if x not in excel_first]
或使用set
:
excel_first = {item[0] for item in excel}
a = [x for x in polo if x not in excel_first]
或者,更好的是,使用字典:
excel = dict(excel)
a = [x for x in polo if x not in excel]
excel
将成为一个字典,您可以使用它来快速查找坐标。
答案 1 :(得分:1)
我建议在这里使用两个列表理解:
>>> excel = [['a', 'a4'], ['b', 'z4']]
>>> polo = ['a','b','d']
>>> [x for x in polo if x not in [i[0] for i in excel]]
['d']
[i[0] for i in excel]
生成一个新的['a', 'b']
列表,它循环遍历[['a', 'a4'], ['b', 'z4']]
并从中获取索引为0
的元素。
无论如何,如果您在excel
中有重复的键,例如它是[['a', 'a4'], ['b', 'z4'], ['b', 'z5'], ['b', 'z7']]
,则[i[0] for i in excel]
的输出将为['a', 'b', 'b', 'b']
。
由于这些'b'
没用,我们可以使用集合理解:
>>> excel = [['a', 'a4'], ['b', 'z4']]
>>> polo = ['a','b','d']
>>> [x for x in polo if x not in {i[0] for i in excel}]
['d']
你也可以忘记列表理解和比较集,如下所示:
>>> excel = [['a', 'a4'], ['b', 'z4']]
>>> polo = ['a','b','d']
>>> set(polo) - {i[0] for i in excel}
{'d'}
请记住,这种方式不会保留顺序和重复键。
答案 2 :(得分:1)
itertools.chain可以提供帮助:
>>> from itertools import chain
>>> [x for x in polo if x not in chain(*excel)]
['d']
chain(*iterables) --> chain object
返回一个链式对象,其
.__next__()
方法返回来自的元素 第一次迭代,直到它耗尽,然后从下一个元素 迭代,直到所有的迭代都用完为止。
答案 3 :(得分:0)
您甚至可以使用filter
和chain
:
>>> from itertools import chain
>>> filter(lambda s:s not in chain(*excel), polo)
['d']
itemgetter
和map
的另一种方式:
>>> from operator import itemgetter
>>> [x for x in polo if x not in map(itemgetter(0),excel)]
['d']
或者:
>>> [x for x in polo if x not in (itemgetter(0)(x) for x in excel)]
['d']