我昨天用Python编写了一个小脚本,这不是我的主要语言,它给我留下了一些关于如何以正确的'pythonic'风格做事的问题。任务相当简单,我有两个数组fieldnames
和values
。想象一下他们的内容是
fieldnames = ['apples','oranges','pears','bananas']
values = [None,2,None,5]
我需要创建一个只包含与非None值对应的索引的字段数组。目前我这样做:
#print fieldnames
usedFieldnames = []
for idx,val in enumerate(values):
if val is not None:
usedFieldnames.append(fieldnames[idx])
我可能是错的,但这对我来说似乎非常恐怖,而且我想知道是否有一种更适合python的方式来实现这一点,并且列表理解。任何帮助,将不胜感激。
答案 0 :(得分:4)
您可以使用zip()
:
>>> fieldnames = ['apples','oranges','pears','bananas']
>>> values = [None,2,None,5]
>>> [field for field, value in zip(fieldnames, values) if value is not None]
['oranges', 'bananas']
如果您使用的是python2.x而不是zip()
,它会创建一个包含压缩列表的新列表,您可以采用“迭代”方法并使用itertools.izip()
:
>>> from itertools import izip
>>> [field for field, value in izip(fieldnames, values) if value is not None]
['oranges', 'bananas']
对于python3.x,zip()
返回迭代器,而不是列表。
答案 1 :(得分:2)
您可以使用enumerate
遍历列表并同时获取当前项目的索引。
print [idx for idx, field in enumerate(fieldnames) if values[idx] is not None]
# [1, 3]
如果你想要字段名,那么
print [field for idx, field in enumerate(fieldnames) if values[idx] is not None]
# ['oranges', 'bananas']
答案 2 :(得分:0)
使用python3中的列表解析在列表中存储偶数的示例:
even_number_collection = [ num for num in range(20) if num%2==0]
# one way to print above list
print(*even_number_collection,sep=" ")
# another way
for a in even_number_collection:
print(a, end=" ")
你可以在这里阅读 https://www.geeksforgeeks.org/python-list-comprehension-and-slicing/