簡體   English   中英

Python:處理兩個列表的“Pythonic”方法是什么?

[英]Python: What's the “Pythonic” way to process two lists?

說我在Python中有這個代碼。 我是Perl程序員,你可能會說。

# Both list1 and list2 are a list of strings
for x in list1:
  for y in list2:
    if y in x:
      return True
return False

有什么更Pythonic的方法來處理這個問題? 我認為列表理解可以做得很好,但我無法理解這個“過程兩個單獨的列表”的一部分。

要將兩個嵌套循環轉換為嵌套理解,您只需執行以下操作:

[<expression> for x in list1 for y in list2]

如果您從未考慮過列表推導如何工作,那么教程會解釋它

列表推導由括號組成,括號中包含一個表達式,后跟一個for子句,然后是零個或多個for或if子句。 結果將是一個新列表,該列表是通過在其后面的for和if子句的上下文中計算表達式得到的。

換句話說,理解中從左到右的條款與從頂部/外部到底部/內部的陳述相匹配,這就是它的全部內容。

這篇博客文章嘗試以另一種方式提出相同的想法,以防你尚未獲得它。


但是在這里,你沒有表達,你有一個聲明。

但是你有一個表達式,聲明的y in x部分中的y in x你要做的是返回True,如果它對任何值都是真的,這正是any做的。 所以:

return any([y in x for x in list1 for y in list2])

實際上,您不希望在此處構建列表,只是迭代值,因此刪除方括號以使其成為生成器表達式:

return any(y in x for x in list1 for y in list2)

對於只迭代多個迭代的笛卡爾積的簡單情況,您可能希望使用itertools.product 在這種情況下,我認為它不會使事情變得更簡單或更具可讀性,但如果你有四個列表而不是兩個 - 或者預先不可預測的數量 - 這可能是一個不同的故事:

return any(y in x for x, y in product(list1, list2))

不,列表理解不能很好。 你想要一個布爾結果,列表推導用於創建列表(並且它們並不真正提前退出)。 你可以使用生成器理解:

return any(y in x for x, y in itertools.product(list1, list2))

或者如果您真的喜歡使用標准庫(或者您認為像功能程序員一樣):

from itertools import starmap, product
from operator import contains

return any(starmap(contains, product(list1, list2))

Steve和abamarts的答案正在解釋你明確提出的問題,我會嘗試解決你對列表理解的暗示。

“嵌套”列表理解只不過是你原來的嵌套for循環,但隨着扭曲,最內部的塊移動到頂部!

for x in list1:
  for y in list2:
    if y in x:
      return True
    else:
      return False

變為:

[True if y in x else False for x in list1 for y in list2]

所以for循環依次保持或多或少:

[for x in list1 for y in list2]

然后添加if子句:

[if y in x else False for x in list1 for y in list2]

最后將if語句的結果前置為True:

[True if y in x else False for x in list1 for y in list2]

一個嵌套的例子:

tpl_list = []
for element in vector:
    for x, y in element:
       if (x**2+y**2) < 1:
          tpl_list.append((1/x, 1/y))
       else:
          tpl_list.append((x,y))

作為列表理解(逐步建立)

[for e in vector for x,y in e]
[if (x**2+y**2) < 1 else for e in vector for x,y in e]
[(1/x, 1/y) if (x**2+y**2) < 1 else (x,y) for e in vector for x,y in e]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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