使用推导式创建一个字典

1564

我能使用列表推导式语法创建一个字典吗?

例如,迭代键值对:

d = {... for k, v in zip(keys, values)}

1
相关:collections.Counter是一种专门用于计数的字典类型:使用字典计算列表中的项目数 - smci
你的例子中的 blah bla 是误导性的,你可能指的是一个元组列表,但它也可以是一个普通的 Python 列表。因此,前几个高票答案都涉及由元组列表构成的字典,而 这个 答案则不是。 - Timo
2
如果您没有使用 zip(...) 而是使用单独的字典,那么您需要执行类似于 d = {... for (k, v) in other_dict.items()} 的操作。 - Miguel Vacas
17个回答

5

试一试这个:

def get_dic_from_two_lists(keys, values):
    return { keys[i] : values[i] for i in range(len(keys)) }

假设我们有两个列表,一个是国家,另一个是首都
country = ['India', 'Pakistan', 'China']
capital = ['New Delhi', 'Islamabad', 'Beijing']

然后从这两个列表创建一个字典:

print get_dic_from_two_lists(country, capital)

输出结果如下:
{'Pakistan': 'Islamabad', 'China': 'Beijing', 'India': 'New Delhi'}

10
你可以使用zip。 - Andre Simon

5

在@Ekhtiar答案的基础上,如果您想从 list 中查找 dict ,则可以使用以下方法:

names = ['a', 'b', 'd', 'f', 'c']
names_to_id = {v:k for k, v in enumerate(names)}
# {'a': 0, 'b': 1, 'c': 2, 'd': 3, 'f': 4}

或者在极少数需要过滤重复项的情况下,先使用set(数字列表中最好的选项):

names = ['a', 'b', 'd', 'f', 'd', 'c']
sorted_list = list(set(names))
sorted_list.sort()
names_to_id = {v:k for k, v in enumerate(sorted_list)}
# {'a': 0, 'b': 1, 'c': 2, 'd': 3, 'f': 4}

names = [1,2,5,5,6,2,1]
names_to_id = {v:k for k, v in enumerate(set(names))}
# {1: 0, 2: 1, 5: 2, 6: 3}

第一个代码块中的v:k是误导性的,它读起来像是value:key,这是创建字典的错误方式。我建议使用{name:index for index, name in enumerate(names)}作为改进。 - bjrne
另外,你根本不需要第二部分。由于它是一个字典,它会通过覆盖条目的方式设计来删除重复项。 - bjrne
@bjrne,我保留了原始答案,并且我认为它并没有误导。不,第二部分是创建查找字典。如果您不使用set,则索引将无序。这是一个罕见的情况,我也给出了输出,所以如果这符合您的用例,请使用它。 - Muhammad Yasirroni

2
>>> {k: v**3 for (k, v) in zip(string.ascii_lowercase, range(26))}

Python支持字典推导式,它允许您使用类似简洁的语法在运行时表达字典的创建。字典推导式采用{key: value for (key, value) in iterable}的形式。这个语法是在Python 3中引入的,并向后移植到Python 2.7,因此无论您安装了哪个版本的Python,都应该能够使用它。一个经典的例子是取两个列表并创建一个字典,其中第一个列表中每个位置上的项成为键,而第二个列表中相应位置上的项成为值。在这个推导式内部使用的zip函数返回一个元组的迭代器,其中元组中的每个元素都来自输入可迭代对象中的同一位置。在上面的例子中,返回的迭代器包含元组("a",1), ("b",2),等等。
{'i': 512, 'e': 64, 'o': 2744, 'h': 343, 'l': 1331, 's': 5832, 'b': 1, 'w': 10648, 'c': 8, 'x': 12167, 'y': 13824, 't': 6859, 'p': 3375, 'd': 27, 'j': 729, 'a': 0, 'z': 15625, 'f': 125, 'q': 4096, 'u': 8000, 'n': 2197, 'm': 1728, 'r': 4913, 'k': 1000, 'g': 216, 'v': 9261}

1

是的,这是可能的。在Python中,可以在列表、集合、字典等数据结构中使用推导式(Comprehension)。您可以按照以下方式编写代码:

mydict = {k:v for (k,v) in blah}

另一个使用条件语句和循环的字典推导的详细示例:
parents = [father, mother]
            
parents = {parent:1 - P["mutation"] if parent in two_genes else 0.5 if parent in one_gene else P["mutation"] for parent in parents}

0

这种方法使用for循环迭代给定日期。

Syntax: {key: value for (key, value) in data}

例如:

# create a list comprehension with country and code:
    Country_code = [('China', 86), ('USA', 1),
            ('Ghana', 233), ('Uk', 44)]

# use iterable method to show results
{key: value for (key, value) in Country_code}

0

假设 blah blah blah 是一个包含两个元组的列表:

我们来看看两种方法:

# method 1
>>> lst = [('a', 2), ('b', 4), ('c', 6)]
>>> dict(lst)
{'a': 2, 'b': 4, 'c': 6}

# method 2
>>> lst = [('a', 2), ('b', 4), ('c', 6)]
>>> d = {k:v for k, v in lst}
>>> d
{'a': 2, 'b': 4, 'c': 6}

0

你可以为每一对键值对创建一个新的字典,并将其与前一个字典合并:

reduce(lambda p, q: {**p, **{q[0]: q[1]}}, bla bla bla, {})

显然,这种方法需要使用functools中的reduce函数。

同样的思路:reduce(lambda p, q: {**p, **dict([q])}, bla bla bla, {}) - Mahmoud

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接