我有一个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)
但我知道这太可怕了。
答案 0 :(得分:0)
您可以执行以下操作:
for itemA in dict:
for itemB in dict[itemA]:
thing += finction_on(itemA, itemB)
这将循环遍历字典中的所有键以及这些键上的所有项目。
答案 1 :(得分:0)
您可以使用sorted
和itertools.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]