我有一个字典,其中的值是不同长度的列表,如下所示:
{"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
这不起作用,但我不知道为什么。谢谢你的帮助!
答案 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。