[英]List comprehension from dict of lists
我有一個字典 -
a = {'b': [1,2,3], 'c':[4,5,6]}
我只想使用list comprehension來實現這個輸出 -
[['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
時,未定義v
。
@Skam有一個很好的例子: 如何解釋double for loop理解
# Without list comprehension
list_of_words = []
for sentence in text:
for word in sentence:
list_of_words.append(word)
return list_of_words
相當於:
[word for sentence in text for word in sentence]
你快到了。 您面臨的主要問題是由於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])
OUTPUT
[['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]]
你可以嘗試使用itertools.product
from itertools import product, chain
a = {'b': [1,2,3], 'c':[4,5,6]}
list(chain(*[product(k, v) for k, v in a.items()]))
結果是
[('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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.