Python 不使用集合的两个字符串列表之间的差异

Python 不使用集合的两个字符串列表之间的差异,python,algorithm,python-2.7,Python,Algorithm,Python 2.7,我有两个字符串列表: list1 = ["python", "java", "perl", "sql"] list2 = [ "scala", "python", "perl"] 我需要一个不同的列表,如: difference = ["java", "sql", "scala"] 我试过: def stringDifference(list1, list2): difference = [] for i in list1: if i not in list2

我有两个字符串列表:

list1 = ["python", "java", "perl", "sql"]
list2 = [ "scala", "python", "perl"]
我需要一个不同的列表,如:

difference = ["java", "sql", "scala"]
我试过:

def stringDifference(list1, list2):
    difference = []
    for i in list1:
        if i not in list2:
            difference.append(i)
    for i in list2:
        if i not in list1:
            difference.append(i)
    print difference

但我只是想看看,在低于3的Python版本中,是否有比此解决方案更有效的方法。

使用
集合。Counter

>>> from collections import Counter
>>> list1 = ["python", "java", "perl", "sql"] 
>>> list2 = [ "scala", "python", "perl"]
>>> [ x for x,y in Counter(list1+list2).items() if y==1 ]
['sql', 'java', 'scala']
使用计数:

>>> my_list = list1+list2
>>> [ x for x in my_list if my_list.count(x)==1 ]
['java', 'sql', 'scala']
布景更好,但你问:

>>> [x for x in list1 if x not in list2 ]+ [ x for x in list2 if x not in list1]
['java', 'sql', 'scala']

使用集合。计数器:

>>> from collections import Counter
>>> list1 = ["python", "java", "perl", "sql"] 
>>> list2 = [ "scala", "python", "perl"]
>>> [ x for x,y in Counter(list1+list2).items() if y==1 ]
['sql', 'java', 'scala']
使用计数:

>>> my_list = list1+list2
>>> [ x for x in my_list if my_list.count(x)==1 ]
['java', 'sql', 'scala']
布景更好,但你问:

>>> [x for x in list1 if x not in list2 ]+ [ x for x in list2 if x not in list1]
['java', 'sql', 'scala']

使用集合。计数器:

>>> from collections import Counter
>>> list1 = ["python", "java", "perl", "sql"] 
>>> list2 = [ "scala", "python", "perl"]
>>> [ x for x,y in Counter(list1+list2).items() if y==1 ]
['sql', 'java', 'scala']
使用计数:

>>> my_list = list1+list2
>>> [ x for x in my_list if my_list.count(x)==1 ]
['java', 'sql', 'scala']
布景更好,但你问:

>>> [x for x in list1 if x not in list2 ]+ [ x for x in list2 if x not in list1]
['java', 'sql', 'scala']

使用集合。计数器:

>>> from collections import Counter
>>> list1 = ["python", "java", "perl", "sql"] 
>>> list2 = [ "scala", "python", "perl"]
>>> [ x for x,y in Counter(list1+list2).items() if y==1 ]
['sql', 'java', 'scala']
使用计数:

>>> my_list = list1+list2
>>> [ x for x in my_list if my_list.count(x)==1 ]
['java', 'sql', 'scala']
布景更好,但你问:

>>> [x for x in list1 if x not in list2 ]+ [ x for x in list2 if x not in list1]
['java', 'sql', 'scala']

您可以添加两个列表理解的结果

>>> list1 = ["python", "java", "perl", "sql"]
>>> list2 = [ "scala", "python", "perl"]
>>> [i for i in list1 if i not in list2] + [i for i in list2 if i not in list1]
['java', 'sql', 'scala']

您可以添加两个列表理解的结果

>>> list1 = ["python", "java", "perl", "sql"]
>>> list2 = [ "scala", "python", "perl"]
>>> [i for i in list1 if i not in list2] + [i for i in list2 if i not in list1]
['java', 'sql', 'scala']

您可以添加两个列表理解的结果

>>> list1 = ["python", "java", "perl", "sql"]
>>> list2 = [ "scala", "python", "perl"]
>>> [i for i in list1 if i not in list2] + [i for i in list2 if i not in list1]
['java', 'sql', 'scala']

您可以添加两个列表理解的结果

>>> list1 = ["python", "java", "perl", "sql"]
>>> list2 = [ "scala", "python", "perl"]
>>> [i for i in list1 if i not in list2] + [i for i in list2 if i not in list1]
['java', 'sql', 'scala']

虽然您可以保持列表的原样,但首先将它们都转换为字典可能会更快,因为字典允许像集合那样进行快速成员资格测试:

list1 = ["python", "java", "perl", "sql"]
list2 = [ "scala", "python", "perl"]

d1 = dict.fromkeys(list1)
d2 = dict.fromkeys(list2)
difference = [i for i in d1 if i not in d2] + [i for i in d2 if i not in d1]

print difference

虽然您可以保持列表的原样,但首先将它们都转换为字典可能会更快,因为字典允许像集合那样进行快速成员资格测试:

list1 = ["python", "java", "perl", "sql"]
list2 = [ "scala", "python", "perl"]

d1 = dict.fromkeys(list1)
d2 = dict.fromkeys(list2)
difference = [i for i in d1 if i not in d2] + [i for i in d2 if i not in d1]

print difference

虽然您可以保持列表的原样,但首先将它们都转换为字典可能会更快,因为字典允许像集合那样进行快速成员资格测试:

list1 = ["python", "java", "perl", "sql"]
list2 = [ "scala", "python", "perl"]

d1 = dict.fromkeys(list1)
d2 = dict.fromkeys(list2)
difference = [i for i in d1 if i not in d2] + [i for i in d2 if i not in d1]

print difference

虽然您可以保持列表的原样,但首先将它们都转换为字典可能会更快,因为字典允许像集合那样进行快速成员资格测试:

list1 = ["python", "java", "perl", "sql"]
list2 = [ "scala", "python", "perl"]

d1 = dict.fromkeys(list1)
d2 = dict.fromkeys(list2)
difference = [i for i in d1 if i not in d2] + [i for i in d2 if i not in d1]

print difference


为什么不想使用set?集在Python2和Python3中都存在?@PeterdeRivaz,我只是希望解决方案更加算法化。@anbu我在下面提供了一个解决方案,但知道使用
set
交集要高效得多,我不确定您认为通过避免
set
,什么会更“算法化”。为什么不想使用set?集在Python2和Python3中都存在?@PeterdeRivaz,我只是希望解决方案更加算法化。@anbu我在下面提供了一个解决方案,但知道使用
set
交集要高效得多,我不确定您认为通过避免
set
,什么会更“算法化”。为什么不想使用set?集在Python2和Python3中都存在?@PeterdeRivaz,我只是希望解决方案更加算法化。@anbu我在下面提供了一个解决方案,但知道使用
set
交集要高效得多,我不确定您认为通过避免
set
,什么会更“算法化”。为什么不想使用set?集在Python2和Python3中都存在?@PeterdeRivaz,我只是希望解决方案更具算法性。@anbu我在下面提供了一个解决方案,但我知道使用
set
intersection要有效得多,我不确定您认为什么更“算法性”通过避免
set
.FWIW,我不认为这是一个特别有效的解决方案(如果我错了,请纠正我),但它更像Pythonic,而且看起来更好看。@Two-bitalchest您是对的,它比使用
set
的效率低,这几乎是
set
的一个完美用例。而且上面的解决方案在结果列表中留下了重复项,我不知道OP想要如何处理它;我同意它的效率远远低于集合。我想说的是,你的解决方案的效率可能与OP的解决方案相同。FWIW我不认为这是一个特别有效的解决方案(如果我错了,请纠正我),但它更像蟒蛇,而且看起来更好看。@Two Bitalchest你是对的,它比使用
set
的效率低,这几乎是
set
的完美用例。而且上面的解决方案在结果列表中留下了重复项,我不知道OP想要如何处理它;我同意它的效率远远低于集合。我想说的是,你的解决方案的效率可能与OP的解决方案相同。FWIW我不认为这是一个特别有效的解决方案(如果我错了,请纠正我),但它更像蟒蛇,而且看起来更好看。@Two Bitalchest你是对的,它比使用
set
的效率低,这几乎是
set
的完美用例。而且上面的解决方案在结果列表中留下了重复项,我不知道OP想要如何处理它;我同意它的效率远远低于集合。我想说的是,你的解决方案的效率可能与OP的解决方案相同。FWIW我不认为这是一个特别有效的解决方案(如果我错了,请纠正我),但它更像蟒蛇,而且看起来更好看。@Two Bitalchest你是对的,它比使用
set
的效率低,这几乎是
set
的完美用例。而且上面的解决方案在结果列表中留下了重复项,我不知道OP想要如何处理它;我同意它的效率远远低于集合。我的意思是说,你的效率可能与OP的解决方案相同。