我有一本字典词典:
from import_export import resources, fields
from import_export.widgets import ForeignKeyWidget
class DataResource(resources.ModelResource):
# UPDATE
# If model has ForeignKey
station = fields.Field(widget=ForeignKeyWidget(station, 'id'))
def get_instance(self, instance_loader, row):
# Returning False prevents us from looking in the
# database for rows that already exist
return False
class Meta:
model = assets # class name should be camelcase
fields = '__all__' # If all column of table present in xlsx otherwise mention fields name.
@admin.register(assets)
class data_import(ImportExportModelAdmin):
resource_class = DataResource
我想将其转换为:
d = {"a": {"x":1, "y":2, "z":3}, "b": {"x":2, "y":3, "z":4}, "c": {"x":3, "y":4, "z":5}}
要求是new_d = {"x":[1, 2, 3], "y": [2, 3, 4], "z": [3, 4, 5]}
和new_d[key][i]
应位于new_d[another_key][i]
的同一子词典中。
所以我创建了d
然后:
new_d = {}
这给了我我的预期,但我只是想知道这个操作是否有一些内置函数,或者有更好的方法。
答案 0 :(得分:6)
此操作没有内置功能,没有。我只是直接遍历values
:
new_d = {}
for sub in d.itervalues(): # Python 3: use d.values()
for key, value in sub.iteritems(): # Python 3: use d.items()
new_d.setdefault(key, []).append(value)
这样可以避免每次都为dict.values()
调用创建新列表。
请注意,词典没有订单。结果列表中的值将符合您的标准;对于new_d
中的每个键,它们将以相同的顺序添加:
>>> d = {"a": {"x":1, "y":2, "z":3}, "b": {"x":2, "y":3, "z":4}, "c": {"x":3, "y":4, "z":5}}
>>> new_d = {}
>>> for sub in d.values():
... for key, value in sub.items():
... new_d.setdefault(key, []).append(value)
...
>>> new_d
{'x': [1, 2, 3], 'y': [2, 3, 4], 'z': [3, 4, 5]}
答案 1 :(得分:0)
如果您喜欢字典和列表理解...
d1 = {"a": {"x": 1, "y": 2, "z": 3},
"b": {"x": 2, "y": 3, "z": 4},
"c": {"x": 3, "y": 4, "z": 5}}
dl1 = {kl: [v for di in d1.values() for k, v in di.items() if k == kl]
for di in d1.values() for kl in di.keys()}
print(dl1)
并产生希望的结果...
{'x': [1, 2, 3], 'y': [2, 3, 4], 'z': [3, 4, 5]}