2016-09-25 49 views
0

我需要能够找到列表中可能有相同的价值观彼此除了两个要素查找列表差异具有相同值

例如

a = ['cool task', 'b', 'another task', 'j', 'better task', 'y'] 
b = ['cool task', 'b', 'a task', 'j', 'another task', 'j', 'better task', 'y'] 

我的问题是如何,这两个差异'a task''another task'两者都后跟一个'j'

[x for x in b if x not in a] 
['a task'] 

因为无论ab包含'j',它将从列表中删除。

我怎么会做出这样我结束了

['a task', 'j'] 
+0

你想找到'B'出现的元素在'b'中比在'a'中更频繁? (请注意,出现一次的次数总是比没有出现次数多)。 –

+1

如果偶数元素与奇数索引中的元素紧密关联,则应该更好地定义突出显示此关联的不同数据结构。 – trincot

回答

1

对于简单的列表 - 你问什么是简单的搜索在列表中的下一个项目:

>>> a = ['cool task', 'b', 'another task', 'j', 'better task', 'y'] 
>>> b = ['cool task', 'b', 'a task', 'j', 'another task', 'j', 'better task', 'y'] 
>>> c = [[x, b[b.index(x) + 1]] for x in b if x not in a] 
>>> c 
[['a task', 'j']] 

但我认为你实际上是在使用字典或元组。

元组:

>>> a = [('cool task', 'b'), ('another task', 'j'), ('better task', 'y')] 
>>> b = [('cool task', 'b'), ('a task', 'j'), ('another task', 'j'), ('better task', 'y')] 
>>> c = [x for x in b if x not in a] 
>>> c 
[('a task', 'j')] 

字典:

>>> a = {'cool task': 'b', 'another task': 'j', 'better task': 'y'} 
>>> b = {'cool task': 'b', 'a task': 'j', 'another task': 'j', 'better task': 'y'} 
>>> c = [(x, b[x]) for x in b if x not in a] 
>>> c 
[('a task', 'j')] 
+0

感谢您的编辑,我可以使用第一个答案,通过使用c [0] [然后我想要什么] –

0

根据你的目的,你可能使用Countercollections module

>>> from collections import Counter 
>>> a = Counter(['cool task', 'b', 'another task', 'j', 'better task', 'y']) 
>>> b = Counter(['cool task', 'b', 'a task', 'j', 'another task', 'j', 'better task', 'y']) 
>>> b-a 
Counter({'j': 1, 'a task': 1}) 
>>> list((b-a).keys()) 
['j', 'a task'] 
1

您可以使用difflib.SequenceMatcher() class枚举添加,删除和更改的条目:

>>> from difflib import SequenceMatcher 
>>> matcher = SequenceMatcher(a=a, b=b) 
>>> added = [] 
>>> for tag, i1, i2, j1, j2 in matcher.get_opcodes(): 
...  if tag == 'insert': 
...   added += b[j1:j2] 
... 
>>> added 
['a task', 'j'] 

以上仅着眼于增加的条目;如果您需要了解删除或更改的条目,那么也有这些事件的操作码,请参阅SequenceMatcher.get_opcodes() method documentation。但是,如果您的输入始终是配对,那么只需从中产生具有元组的集合(使用pair-wise iteration);那么你可以做任何这些集合操作:

aset = set(zip(*([iter(a)] * 2))) 
bset = set(zip(*([iter(b)] * 2))) 
difference = bset - aset 

演示:

>>> aset = set(zip(*([iter(a)] * 2))) 
>>> bset = set(zip(*([iter(b)] * 2))) 
>>> aset 
{('another task', 'j'), ('cool task', 'b'), ('better task', 'y')} 
>>> bset 
{('a task', 'j'), ('another task', 'j'), ('cool task', 'b'), ('better task', 'y')} 
>>> bset - aset 
{('a task', 'j')} 
+0

这看起来像一个有用的模块。我没有意识到这一点。 –

1

,只要你想它的工作原理:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 


def difference(a, b): 
    a, b = (lambda x, y: (y, x) if len(set(x)) > len(set(y)) else (x, y)) (a, b) 
    a_result = list(a) 
    b_result = list(b) 

    for z in range(len(a)): 
     if a[z] in b: 
      a_result.remove(a[z]) 
      b_result.remove(a[z]) 

    return a_result, b_result 
    # or 
    # return a_result if len(set(a_result)) > len(set(b_result)) else b_result 


def main(): 
    a = ['cool task', 'b', 'another task', 'j', 'better task', 'y'] 
    b = ['cool task', 'b', 'a task', 'j', 'another task', 'j', 'better  task', 'y'] 
    print(difference(a, b)) 


if __name__ == "__main__": 
    main() 
相关问题