python:用列表值遍历一个字典 [英] python: iterating through a dictionary with list values

查看:694
本文介绍了python:用列表值遍历一个字典的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

给出列表的字典,例如

  d = {'1':[11,12],'2 ':[21,21]} 

哪些是更多的pythonic或其他更好:

$在d中,




$ b#无论k,x

 在d.iteritems()中的k,dk:
在dk中的x:
#无论与k,x

还是有其他要考虑的东西?



编辑,如果列表可能有用(例如,标准版不保存订单),这可能是适当的,虽然要慢一些。

  d2 = d.items()
for k在d2中:
for d2 [1]:
#无论与k,x


解决方案

这是一个速度测试,为什么不:

  import random 
numEntries = 1000000
d = dict(zip(range(numEntries)),[ra ndom.sample(range(0,100),2)for x in range(numEntries)]))

def m1(d):
for d in:
对于d [k]中的x:
pass

def m2(d):
for k,dk in d.iteritems():
for x in dk :
pass

import cProfile

cProfile.run('m1(d)')

打印

cProfile.run('m2(d)')

#冉3试验:
#m1:0.205,0.194,0.193:平均0.197 s
#m2:0.176 ,0.166,0.173:平均0.172 s

#方法1比方法2多15%的时间

cProfile示例输出:

  0.194秒内的3个函数调用

按:标准名称

ncalls tottime percall cumtime percall文件名:lineno(功能)
1 0.000 0.000 0.194 0.194< string>:1(< module>)
1 0.194 0.194 0.194 0.194 stackoverflow.py:7(m1)
1 0.000 0.000 0.000 0.000 {方法'禁用''_lsprof.Profiler'对象}



4个函数调用0.179秒

订购者:标准名称

ncalls tottime percall cumtime percall文件名:lineno(功能)
1 0.000 0.000 0.179 0.179< string>:1(< module>)
1 0.179 0.179 0.179 0.179 stackoverflow .py:12(m2)
1 0.000 0.000 0.000 0.000 {method'disable'of'_lsprof.Profiler'objects}
1 0.000 0.000 0.000 0.000 {method'iteritems'of'dict'objects}


Given a dictionary of lists, such as

d = {'1':[11,12], '2':[21,21]}

Which is more pythonic or otherwise preferable:

for k in d:
    for x in d[k]:
        # whatever with k, x

or

for k, dk in d.iteritems():
    for x in dk:
        # whatever with k, x

or is there something else to consider?

EDIT, in case a list might be useful (e.g., standard dicts don't preserve order), this might be appropriate, although it's much slower.

d2 = d.items()
for k in d2:
        for x in d2[1]:
            # whatever with k, x

解决方案

Here's a speed test, why not:

import random
numEntries = 1000000
d = dict(zip(range(numEntries), [random.sample(range(0, 100), 2) for x in range(numEntries)]))

def m1(d):
    for k in d:
        for x in d[k]:
            pass

def m2(d):
    for k, dk in d.iteritems():
        for x in dk:
            pass

import cProfile

cProfile.run('m1(d)')

print

cProfile.run('m2(d)')

# Ran 3 trials:
# m1: 0.205, 0.194, 0.193: average 0.197 s
# m2: 0.176, 0.166, 0.173: average 0.172 s

# Method 1 takes 15% more time than method 2

cProfile example output:

         3 function calls in 0.194 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.194    0.194 <string>:1(<module>)
        1    0.194    0.194    0.194    0.194 stackoverflow.py:7(m1)
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}



         4 function calls in 0.179 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.179    0.179 <string>:1(<module>)
        1    0.179    0.179    0.179    0.179 stackoverflow.py:12(m2)
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
        1    0.000    0.000    0.000    0.000 {method 'iteritems' of 'dict' objects}

这篇关于python:用列表值遍历一个字典的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆