对pythonic风格和列表理解有困难

2024-09-28 20:56:41 发布

您现在位置:Python中文网/ 问答频道 /正文

昨天我用Python写了一个小脚本,Python不是我的主要语言,它给我留下了一些关于如何用pythonic风格做事的问题。任务相当简单,我有两个数组fieldnamesvalues。想象一下它们的内容是

fieldnames = ['apples','oranges','pears','bananas']
values = [None,2,None,5]

我需要创建一个字段名数组,它只包含与非空值对应的索引。目前我是这样做的:

#print fieldnames
usedFieldnames = []

for idx,val in enumerate(values):
    if val is not None:
        usedFieldnames.append(fieldnames[idx])

我可能错了,但这对我来说似乎不是pythonic,我想知道是否有一种更适合python的方法来使用列表理解来实现这一点。任何帮助都将不胜感激。你知道吗


Tags: 脚本none语言内容风格val数组pythonic
3条回答

您可以使用^{}

>>> 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(),后者使用压缩列表创建新列表,那么您可以采用“迭代”方法并使用^{}

>>> from itertools import izip
>>> [field for field, value in izip(fieldnames, values) if value is not None]
['oranges', 'bananas']

在python3.x中,zip()返回一个迭代器,而不是一个列表。你知道吗

可以使用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']

在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/

相关问题 更多 >