簡體   English   中英

Python 條件迭代的列表理解

[英]Python List comprehension with conditional iteration

只是想問一下這組特定的代碼是否可以表示為單行列表理解:

files = ["country_Maldives", "country_East Timor", "country_Laos", "country_Uruguay"]
accountlist = ["Laos", "Maldives"]

final_list = []
for account in accountlist:
    included = [file for file in files if account in file][0]
    final_list.append(included)

謝謝你。

由於您的代碼只是獲取所有匹配項並選擇第一個匹配項:

[file for file in files if account in file][0]

您可以改為使用next()繼續檢索下一項,直到找到匹配項:

result = [next(file for file in files if account in file) for account in accountlist]

print(result)
# ['country_Laos', 'country_Maldives'] => Same output as your original code

上面的唯一問題是,如果迭代器用盡並且找不到匹配項,則會引發StopIteration異常。 為了防止這種情況,我們可以提供一個默認值,例如None ,所以它返回這個值而不是異常。

[next((file for file in files if account in file), None) for account in accountlist]

然后,如果我們想過濾掉None匹配項,我們可以使用另一個列表推導來做到這一點:

filtered = [file for file in result if file is not None]

查看any/all運算符:

ret = [file for file in files if any(account in file for account in accountlist)]

https://docs.python.org/3/library/functions.html#any

UDP

上面的 Oneliner 返回所有文件的列表,每個文件都包含任何帳戶。 如果您只想按給定條件查找第一個條目,運算符next也值得一提:

ret = [next((file for file in files if account in file), []) for account in accountlist]

https://docs.python.org/3/library/functions.html#next

只是另一種方式,嵌套for循環......

In [19]: files = ["country_Maldives", "country_East Timor", "country_Laos", "country_Uruguay"]
    ...: accountlist = ["Laos", "Maldives"]

In [20]: res=[file  for acc in accountlist for file in files  if acc in file.split('_')]

In [21]: res
Out[21]: ['country_Laos', 'country_Maldives']

暫無
暫無

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

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