我有两个长度相同的列表:
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)
但它抱怨... 任何想法?
答案 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'])})
defaultdict
是dict
的子类,并且行为方式相同。
答案 1 :(得分:2)
我个人使用Martijn的defaultdict
方法,但我认为我会解决您当前尝试的问题。
您的代码存在问题:
a = zip(blist, alist)
for key, value in a:
a.setdefault(k, set[]).append(v)
那是:
zip
之后,a
现在是一个列表,因此它不支持.setdefault
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 }