从Python中的列表中检索dict值

时间:2016-10-21 14:34:22

标签: python dictionary

我有一个字典,其中的值是不同长度的列表,如下所示:

{"a":[1,2,3], "b":[4,3,5,6,7], "c":[1], "d":[2,5]}

我想将其转换为上传到数据库的元组列表:

[("a",1), ("a",2), ("a",3), ("b",4), ("b",3) ... ]

我最近尝试的是:

lst = []
mydict = {"a":[1,2,3], "b":[4,3,5,6,7], "c":[1], "d":[2,5]}
for k in mydict.keys():
    for i in range(len(mydict[k])):
        count = 0
        while count < i:
            lst.append((k, mydict[k]))
            count += 1

这不起作用,但我不知道为什么。谢谢你的帮助!

4 个答案:

答案 0 :(得分:4)

感觉你有点过于复杂......

它应该只需要2个循环:

2019-07-18

第一个循环在字典项上,内循环在值列表上。对于值列表中的每个值,只需将包含键和值的元组附加到结果列表中。

而且,FWIW,这里有很多其他拼写:

lst = []
for k, vals in mydict.items():
    for value in vals:
        lst.append((k, value))

甚至是1-liner

lst = []
for k, vals in mydict.items():
    lst.extend((k, value) for value in vals)

虽然我不是1行版本的忠实粉丝......

至于您的

lst = [(k, value) for k, vals in mydict.items() for value in vals]

我们看到的第一件事是你有一个额外的循环。对于每个键,当您只想击中它们一次时,您将会击中一些值。您可以通过移除lst = [] mydict = {"a":[1,2,3], "b":[4,3,5,6,7], "c":[1], "d":[2,5]} for k in mydict.keys(): for i in range(len(mydict[k])): count = 0 while count < i: lst.append((k, mydict[k])) count += 1 上的循环

修复它
range(len(...))

但是,这已经比我上面提供的选项更加冗长(以及恕我直言,令人困惑)的方式。

答案 1 :(得分:0)

你应该尽可能避免在python中使用for循环,效率非常低。使用列表理解作为执行此操作的最pythonic方式。 stack是dict的名称:

[(i,x) for x in stack[i] for i in stack.keys()]

答案 2 :(得分:0)

new_list = []
for key, values in mydict.items():
    for val in values:
        new_list.append((key, val))

答案 3 :(得分:0)

使用itertools和zip:

import itertools
d = {"a":[1,2,3], "b":[4,3,5,6,7], "c":[1], "d":[2,5]}
result = []
for k, v in d.items():
    result.extend(zip(itertools.cycle(k), v))

或:

for k, v in d.items():
    result.extend(itertools.izip(itertools.cycle(k), v))

itertools.repeat也可用于代替itertools.cycle。