[英]Elegant way for multiple for in?
在這種情況下,python中的優雅方法是什么?
products_names = ''
for movement in movements:
for product in movement.products:
products_names += product.name + ', '
這將正常工作:
products_names = ', '.join([product.name for movement in movements for product in movement.products])
列表理解,為所有產品創建一個product.name
列表。 然后,我們在', '
上join
列表以獲取最終的字符串。
您還可以通過使用生成器表達式來避免一起創建列表:
products_names = ', '.join(product.name for movement in movements for product in movement.products)
注意,使用join()
,列表生成比生成器表達式提供更好的結果。
在這種情況下,使用map
和匿名函數可能使其更具可讀性; 這值得商.。
", ".join(map(lambda x: ", ".join(x.products), movements))
還可以使用reduce
,但是其可讀性可能低於理解:
reduce(lambda y,z: y + ", " + z, map(lambda x: ", ".join(x.products), movements))
您可以通過使用chain
略微縮短上面的一些示例,這對於展平列表列表非常有用:
from itertools import chain
product_names = ', '.join([x.name for x in chain(*movements)])
假設movements
== [l1, l2, l3, ...]
並且對於每個l
,它們看起來像[p1, p2, p3, p4, ...]
,那么它的作用是:
chain(*movements)
這對運動進行了一個平坦化。 *將動作展開到鏈函數中-即,這實際上與調用chain(l1, l2, l3)
。
[x.name for x in chain(*movements)]
但是我們實際上希望對每個項目進行一些處理,因此添加列表推導來代替我們想要的值。
請注意,由於加入,列表理解仍然更快。 不進行查找,我得到以下結果:
tl = [['a', 'b', 'c'], ['c', 'd', 'e'], ['e', 'f', 'g']]
%timeit ','.join(chain(*tl))
100000 loops, best of 3: 1.78 us per loop
%timeit ','.join([x for l in tl for x in l])
1000000 loops, best of 3: 1.09 us per loop
%timeit ','.join([x for x in chain(*tl)])
1000000 loops, best of 3: 1.41 us per loop
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.