簡體   English   中英

從列表的詞典列出理解

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM