我有以下列表:
keys = ['god', 'hel', 'helo']
values = ['good','god', 'hell', 'hello']
我想创建一个这样的字典:
{'god':set(['god', 'good']), 'hel':'hell', 'helo': 'hello'}
其中密钥是通过将值中的重复字母减少为单个字母来确定的。
我如何以编程方式执行此操作?
答案 0 :(得分:3)
“所有重复的字母都缩写为单个字母”
实际上根据此规则,您不需要keys
列表,因为它将从values
创建。
此外,我建议对所有值使用集合的dict,也为单个值使用,例如“hell”和“hello”。它将使字典更多的使用更简单:
import itertools as it
values = ['good','god', 'hell', 'hello']
d = {}
for value in values:
d.setdefault(''.join(k for k,v in it.groupby(value)), set()).add(value)
# d == {'god': set(['god', 'good']),
# 'hel': set(['hell']),
# 'helo': set(['hello'])}
答案 1 :(得分:1)
这应该适合你:
import re
import collections
values = ['good', 'god', 'hell', 'hello']
result = collections.defaultdict(set)
for value in values:
key = re.sub(r'(\w)\1*', r'\1', value)
result[key].add(value)
# result: defaultdict(<type 'set'>, {'hel': set(['hell']), 'god': set(['god', 'good']), 'helo': set(['hello'])})
# if you want to ensure that all your keys exist in the dictionary
keys = ['god', 'hel', 'helo', 'bob']
for key in keys:
result[key]
# result: defaultdict(<type 'set'>, {'hel': set(['hell']), 'god': set(['god', 'good']), 'helo': set(['hello']), 'bob': set([])})
答案 2 :(得分:0)
在eumiro的回答中,有些代码打高尔夫球(可能显然更加混淆),观察到itertools.groupby可以使用两次(一次是按照外观顺序得到字母集,我没想到 - 并再次实际创建字典的键值对。
from itertools import groupby
data = ['good', 'god', 'hell', 'hello']
dict((''.join(k), list(v)) for k, v in groupby(data, lambda x: zip(*groupby(x))[0]))
工作原理:首先使用lambda x: zip(*groupby(x))[0]
处理每个单词。也就是说,我们获取groupby
生成器生成的(字母,石斑鱼对象)对的列表,将其转换为一对(字母列表,石斑对象列表)(生成器内容)被隐式评估为传递给zip
),并丢弃我们不想要的石斑鱼对象列表。然后,我们根据每个单词产生的字母列表对整个单词列表进行分组,将字母列表转换回字符串,评估分组器 - 对象生成器以获取相应的单词,并使用这些键值用于构造最终dict
。
编辑:我想在lambda中执行''.join
步骤更简洁:
from itertools import groupby
data = ['good', 'god', 'hell', 'hello']
dict((k, list(v)) for k, v in groupby(data, lambda x: ''.join(zip(*groupby(x))[0])))