Python 从列表的dict理解列表
我有一个口述-Python 从列表的dict理解列表,python,list-comprehension,Python,List Comprehension,我有一个口述- a = {'b': [1,2,3], 'c':[4,5,6]} 我只想使用列表理解来实现这个输出- [['c', 4], ['c', 5], ['c', 6], ['b', 1], ['b', 2], ['b', 3]] 一个简单的for循环就可以完成它- x = [] for k, v in a.iteritems(): for i in v: x.append([k, i]) 试图将其转换为列表理解,我这样做了- [[k,i] for i in
a = {'b': [1,2,3], 'c':[4,5,6]}
我只想使用列表理解来实现这个输出-
[['c', 4], ['c', 5], ['c', 6], ['b', 1], ['b', 2], ['b', 3]]
一个简单的for循环就可以完成它-
x = []
for k, v in a.iteritems():
for i in v:
x.append([k, i])
试图将其转换为列表理解,我这样做了-
[[k,i] for i in v for k, v in a.items()]
但奇怪的是,我得到了一个输出
[['c', 1], ['b', 1], ['c', 2], ['b', 2], ['c', 3], ['b', 3]]
什么是正确的列表理解,为什么我的列表理解不起作用
b = [[i, j] for i in a for j in a[i]]
对于列表理解中的嵌套
for
循环,第一个循环将是您将在第二个循环中使用其变量的循环,例如,第二个循环中使用了i
,列表理解中的嵌套for循环很难读取,因此您最好避免它。您应该首先获得k,v
,然后在v上迭代:
a = {'b': [1,2,3], 'c':[4,5,6]}
print([[k,i] for k, v in a.items() for i in v])
输出:
[['c', 4], ['c', 5], ['c', 6], ['b', 1], ['b', 2], ['b', 3]]
注:
在[[k,i]for i In v for k,v In a.items()]
中,当您尝试对其进行迭代时,未定义v
@Skam有一个很好的例子:
相当于:
[word for sentence in text for word in sentence]
你可以尝试使用
结果是
[('b', 1), ('b', 2), ('b', 3), ('c', 4), ('c', 5), ('c', 6)]
如果您非常需要列表列表,您可以这样做
list(chain(*[[list(item) for item in product(k, v)] for k, v in a.items()]))
输出为:
[['b', 1], ['b', 2], ['b', 3], ['c', 4], ['c', 5], ['c', 6]]
还有一些性能测试
In [6]: %timeit [[i, j] for i in a for j in a[i]]
618 ns ± 5.34 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [7]: %timeit list(chain(*[product(k, v) for k, v in a.items()]))
1.26 µs ± 19.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [8]: %timeit list(chain(*[[list(item) for item in product(k, v)] for k, v in a.items()]))
2.61 µs ± 49.9 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
你就快到了。您面临的主要问题是for循环的顺序 列表理解中for循环的顺序基于它们在传统循环方法中出现的顺序。首先是最外层的环,然后是内层环。
a = {'b': [1,2,3], 'c':[4,5,6]}
x = []
for k, v in a.items():
for i in v:
x.append([k, i])
print(x)
print([[k,i] for i in v for k, v in a.items()])
print([[k,i] for k, v in a.items() for i in v])
输出
[['b', 1], ['b', 2], ['b', 3], ['c', 4], ['c', 5], ['c', 6]]
[['b', 4], ['c', 4], ['b', 5], ['c', 5], ['b', 6], ['c', 6]]
[['b', 1], ['b', 2], ['b', 3], ['c', 4], ['c', 5], ['c', 6]]
为什么在列表中位于a.items()的右侧而不在左侧?这与。在您的实现中,当您尝试对v进行迭代时,v尚未定义。如果您将此添加到您的答案中,并且这将完全回答我的问题,这将非常有帮助谢谢,对您的答案进行了投票,argo在您这样做之前添加了一个完整的答案,在
a.items()的右侧接受了他的答案Why
而不在列表理解的左侧?抱歉,没有收到您的问题?我们如何确定列表理解中for循环的顺序?对于列表理解中嵌套的for
循环,第一个循环将是您将在第二个循环中使用其变量的循环,例如,第二个循环中使用了i
,列表理解中嵌套的for循环很难阅读,因此您最好避免它。谢谢,对您的答案进行了投票,完整的答案也应该是其中的解释
a = {'b': [1,2,3], 'c':[4,5,6]}
x = []
for k, v in a.items():
for i in v:
x.append([k, i])
print(x)
print([[k,i] for i in v for k, v in a.items()])
print([[k,i] for k, v in a.items() for i in v])
[['b', 1], ['b', 2], ['b', 3], ['c', 4], ['c', 5], ['c', 6]]
[['b', 4], ['c', 4], ['b', 5], ['c', 5], ['b', 6], ['c', 6]]
[['b', 1], ['b', 2], ['b', 3], ['c', 4], ['c', 5], ['c', 6]]