簡體   English   中英

優雅的多入方式?

[英]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() ,列表生成比生成器表達式提供更好的結果。

product_names = ", ".join([product.name for movement in movements for product in movement.products])

該解決方案利用了字符串的join方法以及列表理解功能

還請注意,我使用了一種理解而不是生成器表達式。 這是因為,盡管生成器通常比理解速度快,但是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.

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