簡體   English   中英

使用鍵和值遍歷 dict 的 Python 2 和 3 兼容方式

[英]Python 2 and 3 compatible way of iterating through dict with key and value

由於使用了iteritems() ,我有以下列表理解僅適用於 Python 2:

foo = [key for key, value in some_dict.iteritems() if value['marked']]

我無法導入任何庫。 有沒有一種干凈的方法可以在 Python 2 和 3 上兼容?

您可以在 Python 2 和 3 中簡單地使用dict.items()

foo = [key for key, value in some_dict.items() if value['marked']]

或者你可以簡單地推出你自己的items生成器版本,就像這樣

def get_items(dict_object):
    for key in dict_object:
        yield key, dict_object[key]

然后像這樣使用它

for key, value in get_items({1: 2, 3: 4}):
    print key, value

我會說使用future模塊比實現自己的模塊更好,許多東西已經以簡約/優化的方式為您完成:

from future.utils import viewitems

foo = [key for key, value in viewitems(some_dict) if value.get('marked')]

如果你對這個viewitems()是如何工作的感到好奇,它很簡單如下:

def viewitems(obj, **kwargs):
    """
    Function for iterating over dictionary items with the same set-like
    behaviour on Py2.7 as on Py3.

    Passes kwargs to method."""
    func = getattr(obj, "viewitems", None)
    if not func:
        func = obj.items
    return func(**kwargs)

注意:如果需要與 2.7 之前的 Python 版本兼容,那么您應該使用iteritems()

from future.utils import iteritems

foo = [key for key, value in iteritems(some_dict) if value.get('marked')]

最簡單的方法是不關心僅使用dict.items()創建的列表:

foo = [key for key, value in some_dict.items() if value['marked']]

下一個選項是使用異常處理程序:

try:
    # Python 2
    iter_some_dict = some_dict.iteritems
except AttributeError:
    # Python 3
    iter_some_dict = some_dict.items

foo = [key for key, value in iter_some_dict if value['marked']]

你使用什么取決於some_dictsome_dict ,以及為所有項目創建列表是否會對性能和內存使用產生相當大的影響。 您必須對您的確切用例進行基准測試以確定這一點。

定義你自己的iteritems

iteritems = lambda d: ((hasattr(d, 'iteritems') and d.iteritems) or d.items)()

foo = [key for key, value in iteritems(some_dict) if value['marked']]

暫無
暫無

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

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