2014-12-04 75 views
0

我有两个字符串列表:差,而没有使用SET

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 

但我只是想看看在Python版本小于3的情况下是否有比这个解决方案有效的方法。

+2

为什么你不希望使用设置做?集合在Python 2和Python 3中都存在? – 2014-12-04 22:55:00

+0

@PeterdeRivaz,我只想让解决方案更具算法性。 – ASANT 2014-12-04 22:57:35

+3

@anbu我在下面提供了一个解决方案,但是知道使用'set'交集的效率要高得多,我不知道你认为通过避免使用set可以更“算法化”。 – CoryKramer 2014-12-04 22:58:18

回答

1

虽然你可以离开名单,因为他们,很可能更快地把他们双双进入词典第一,允许像套快速检测成员做:

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 
0

使用collections.Counter:使用count

>>> 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'] 
2

您可以添加两个列表内涵

>>> 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'] 
的结果
+0

FWIW我不认为这是一个特别有效率的解决方案(如果我错了,就纠正我),但是Pythonic更好看。 – 2014-12-04 22:58:22

+0

@ Two-BitAlchemist你是对的,它比使用'set'效率低,这对'set'几乎是一个完美的用例。另外上面的解决方案在结果列表中留下了重复项,我不知道OP如何处理它。 – CoryKramer 2014-12-04 22:59:58

+1

正确;我同意它远远低于套件的效率。我打算评论说,你的可能与OP的解决方案效率相同。 – 2014-12-04 23:02:05