循环python dict的有效方法?

时间:2015-12-15 22:31:23

标签: python performance dictionary

我有一个python dict,其格式如下:

for (itemA, itemB) in items.keys():
    Do_something_with(itemA, itemB)

itemA有许多itemB与之关联,但它不具有确定性。例如,itemA的一个实例可能有10 itemB个,但itemA的另一个实例可能只有1个。

我想循环遍历数组:

thing = 0
for (itemA, ~) in items.keys()[0]:
    for itemB in all_items_associated_with(itemA):
        thing += function_on(itemA, itemB)

我可以想出一些计算方式非常昂贵的方法,但我觉得有更多的pythonic和/或有效的方法来做到这一点。这是一种非常昂贵的方法

thing = 0
itemAs = find_all_itemAs(items)
for itemA in itemAs:
    for (itemAtmp, itemB) in items.keys():
        if( itemAtmp == itemA ):
            thing += function_on(itemA, itemB)

但我知道这太可怕了。

4 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

for itemA in dict:
    for itemB in dict[itemA]:
        thing += finction_on(itemA, itemB)

这将循环遍历字典中的所有键以及这些键上的所有项目。

答案 1 :(得分:0)

您可以使用sorteditertools.groupby有效地将相关项目组合在一起。

keys = sorted(items.keys())
for itemA, it in itertools.groupby(keys, lambda x: x[0]):
    for _, itemB in it:
        thing += function_on(itemA, itemB)

答案 2 :(得分:0)

以下是可能的替代方案:

  • 使用itertools.groupby对相关密钥进行分组:

    for itm_a, group in itertools.groupby(sorted(dict), lambda itm_a, itm_b: itm_a):
        # now we can process everything that has the same first item
        my_thing = sum([function_on(itm_a, itm_b) for _, itm_b in group], 0)
    
  • 不使用itertools.group_by的类似方法是自己发现群组

    groups = {}
    for itm_a, itm_b in dict:
        groups.setdefault(itm_a, []).append(itm_b)
    
    # now we can process all of the related keys together
    for itm_a, all_itm_b in groups.items():
        # do something
        my_thing = sum([function_on(itm_a, itm_b) for itm_b in all_itm_b], 0)
    

答案 3 :(得分:0)

听起来你只是使用了错误的数据结构,你真的想要一个dicts的词典,所以你可以做这样的事情:

for itemA in dictOfDicts:
    thing = 0
    for itemB in dictOfDicts[itemA]:
        value = dictOfDicts[itemA][itemB]
        thing += fun(itemA, itemB, value)
    save(thing)

通过这样的操作,您可以轻松地从当前数据结构中获取dicts的字典:

dictOfDicts = {}
for (itemA, itemB) in items:
    if itemA not in dictOfDicts:
        dictOfDicts[itemA] = {}
    dictOfDicts[itemA][itemB] = items[itemA, itemB]