【问题标题】:Having trouble with pythonic style and list comprehensionpythonic风格和列表理解有问题
【发布时间】:2014-04-23 14:21:29
【问题描述】:

我昨天用 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])

我可能是错的,但这对我来说似乎非常不符合 Python 风格,我想知道是否有更适合 Python 的方式来通过列表理解来做到这一点。任何帮助,将不胜感激。

【问题讨论】:

    标签: python list coding-style list-comprehension


    【解决方案1】:

    你可以使用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() 返回一个迭代器,而不是一个列表。

    【讨论】:

    • 你会说zip 在这种情况下会创建一个不必要的列表吗?
    • 你可能想使用izip
    • 请记住,如果您使用的是 Python 3,zip 不会创建不必要的列表,而且初学者可能还是应该使用 3。
    • 在大多数情况下,使用itertools.izip 的优化是不成熟的/不需要的。
    【解决方案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']
    

    【讨论】:

    • @alecxe 谢谢 :) 更新了我的答案。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-22
      • 1970-01-01
      相关资源
      最近更新 更多