Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从列表的dict理解列表_Python_List Comprehension - Fatal编程技术网

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]]