首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在Python中遍历字典或列表

在Python中遍历字典或列表
EN

Stack Overflow用户
提问于 2012-09-07 21:25:39
回答 6查看 16.4K关注 0票数 14

我只是用Python语言写了一些遍历dictlist的讨厌代码。我有种感觉,这不是最好的方式。

问题是,为了迭代一个字典,这是一个约定:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for key in dict_object:
    dict_object[key] = 1

但是,如果在列表上执行相同的操作,则按键修改对象属性将不起作用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Throws an error because the value of key is the property value, not 
#     the list index:

for key in list_object:
    list_object[key] = 1 

我解决这个问题的方法是编写这个讨厌的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if isinstance(obj, dict):
    for key in obj:
        do_loop_contents(obj, key)
elif isinstance(obj, list):
    for i in xrange(0, len(obj)):
        do_loop_contents(obj, i)

def do_loop_contents(obj, key):
    obj[key] = 1

有没有更好的方法来做这件事?

谢谢!

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-09-07 21:33:07

我从来不需要这样做,从来没有。但如果我这样做了,我可能会这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
seq_iter = x if isinstance(x, dict) else xrange(len(x))

例如,在函数形式中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> def seq_iter(obj):
...     return obj if isinstance(obj, dict) else xrange(len(obj))
... 
>>> x = [1,2,3]
>>> for i in seq_iter(x):
...     x[i] = 99
... 
>>> x
[99, 99, 99]
>>> 
>>> x = {1: 2, 2:3, 3:4}
>>> for i in seq_iter(x):
...     x[i] = 99
... 
>>> x
{1: 99, 2: 99, 3: 99}
票数 15
EN

Stack Overflow用户

发布于 2012-09-07 21:41:42

这是正确的方法,但如果出于某种原因,您需要以相同的方式对待这两个对象,则可以创建一个迭代器,它将返回索引/键:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def common_iterable(obj):
    if isinstance(obj, dict):
        return obj
    else:
        return (index for index, value in enumerate(obj))

它将按照您想要的方式运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> d = {'a': 10, 'b': 20}
>>> l = [1,2,3,4]
>>> for index in common_iterable(d):
    d[index] = 0

>>> d
{'a': 0, 'b': 0}
>>> for index in common_iterable(l):
    l[index] = 0

>>> l
[0, 0, 0, 0]

或者更有效地使用生成器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def common_iterable(obj):
    if isinstance(obj, dict):
        for key in obj:
            yield key
    else:
        for index, value in enumerate(obj):
            yield index
票数 6
EN

Stack Overflow用户

发布于 2012-09-07 21:40:52

要成为pythonic和ducktype-y,也要遵循“请求宽恕而不是许可”,你可以这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
try:
    iterator = obj.iteritems()
except AttributeError:
    iterator = enumerate(obj)
for reference, value in iterator:
    do_loop_contents(obj, reference)

不过,如果您需要的只是键/索引:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
try:
    references = obj.keys()
except AttributeError:
    references = range(len(obj))
for reference in references:
    do_loop_contents(obj, reference)

或者作为一个函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def reference_and_value_iterator(iterable):
    try:
        return iterable.iteritems()
    except AttributeError:
        return enumerate(iterable)

for reference, value in reference_and_value_iterator(obj):
    do_loop_contents(obj, reference)

或者仅供参考:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def references(iterable):
    try:
        return iterable.keys()
    except AttributeError:
        return range(len(iterable))

for reference in references(obj):
    do_loop_contents(obj, reference)
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12325608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文