计算两个同步列表中的数字和相关值的发生率

时间:2013-03-12 15:24:20

标签: python python-2.6

我有两个长度相同的列表:

alist = ['XX', 'HH', 'GG', 'XX', 'II', 'PP', 'LL', 'TT', 'KK', 'XX']
blist = [2, 3, 5, 5, 9, 8, 9, 4, 7, 2]

我想知道alist中的哪些值在blist中具有相同的数字。我希望结果看起来像这样:

2 = XX; 3 = HH; 5 = GG,XX; 9 = II,LL; 8 = PP; 4 = TT; 7 = KK

我解决了这个问题:

from collections import defaultdict
adict = {}
a = zip(blist, alist)
for key, value in a:
    adict.setdefault(k, []).append(v)

给出了这个结果: adict:

{2: ['XX', 'XX'], 3: ['HH'], 4: ['TT'], 5: ['GG', 'XX'], 7: ['KK'], 8: ['PP'], 9: ['II', 'LL']}

但我不想要两次相同的值,例如2:['XX','XX'] - 我想改为2:['XX']。

I tried this using 'set' before the list of values:
a = zip(blist, alist)
for key, value in a:
    a.setdefault(k, set[]).append(v)

但它抱怨... 任何想法?

3 个答案:

答案 0 :(得分:2)

使用您导入的defaultdict类型,但忽略:

from collections import defaultdict

a = defaultdict(set)
for k, v in zip(blist, alist):
    a[k].add(v)

结果:

>>> a
defaultdict(<type 'set'>, {2: set(['XX']), 3: set(['HH']), 4: set(['TT']), 5: set(['GG', 'XX']), 7: set(['KK']), 8: set(['PP']), 9: set(['II', 'LL'])})

defaultdictdict的子类,并且行为方式相同。

答案 1 :(得分:2)

我个人使用Martijn的defaultdict方法,但我认为我会解决您当前尝试的问题。

您的代码存在问题:

a = zip(blist, alist)
for key, value in a:
    a.setdefault(k, set[]).append(v)

那是:

  • zip之后,a现在是一个列表,因此它不支持.setdefault
  • for循环中未使用
  • k - 它应为key
  • v未在for循环中使用=它应为value
  • set[]无效的synatx - 创建新的set - 使用set()
  • set没有.append - 而是您要使用add

更正后的代码:

d = {}
a = zip(blist, alist)
for key, value in a:
    d.setdefault(key, set()).add(value)

根据需要调整以下内容进行打印:

for k, v in d.iteritems():
    if k > 5:
        print '{0}: {1}'.format(k, ','.join(v))

答案 2 :(得分:0)

使用您的代码,然后添加:

a = {x: set(a[x]) for x in a }