0

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

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 = 高;5 = GG,XX;9 = II,LL;8 = 聚丙烯;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)

但它抱怨......有什么想法吗?

4

3 回答 3

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'])})

defaultdict是的子类,dict并且在其他情况下的行为方式相同。

于 2013-03-12T15:25:48.707 回答
2

我个人会使用 Martijn 的defaultdict方法,但我想我会用你当前的尝试解决这些问题。

您的代码的问题:

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

就是它:

  • 之后zipa现在是一个列表,所以它不支持.setdefault
  • k不在 for 循环中使用 - 它应该是key
  • v没有在 for 循环中使用 = 它应该是value
  • set[]无效的 synatx - 创建一个新的set- 使用set()
  • Aset没有.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))
于 2013-03-12T15:42:18.837 回答
0

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

a = {x: set(a[x]) for x in a }
于 2013-03-12T15:32:49.633 回答