制作带有集合和值的字典

时间:2011-10-19 07:08:14

标签: python dictionary

我有以下列表:

keys = ['god', 'hel', 'helo']
values = ['good','god', 'hell', 'hello']

我想创建一个这样的字典:

{'god':set(['god', 'good']), 'hel':'hell', 'helo': 'hello'}

其中密钥是通过将值中的重复字母减少为单个字母来确定的。

我如何以编程方式执行此操作?

3 个答案:

答案 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])))