python 中每个键的扁平化值
Flatten values of every key in python
我有这样的字典:
migration_dict = {'30005': ['key42750','key43119', 'key44103', ['key333'],
['key444'], ['keyxx']], '30003': ['key43220', 'key42244','key42230',
['keyzz'], ['kehh']]}
我怎样才能将每个键的值展平以得到类似这样的东西:
migration_dict = {'30005': ['key42750','key43119', 'key44103', 'key333',
'key444', 'keyxx'], '30003': ['key43220', 'key42244','key42230',
'keyzz', 'kehh']}
for key in migration_dict:
for i in migration_dict[key]:
if type(i) == list:
migration_dict[key].remove(i)
for element in i:
migration_dict[key].append(element)
现在这个循环应该完成了。但是请注意,这仅在内部列表中没有更多列表时才有效。如果确实如此,那么您可能必须创建一个递归函数来为您将其展平。
您可以编写一个递归函数来展平值列表,并在字典理解中使用它来构建新字典:
def flatten(lst):
for x in lst:
if isinstance(x, list):
for y in flatten(x): # yield from flatten(...) in Python 3
yield y #
else:
yield x
migration_dict = {k: list(flatten(v)) for k, v in dct.items()}
print(migration_dict)
# {'30005': ['key42750', 'key43119', 'key44103', 'key333', 'key444', 'keyxx'], '30003': ['key43220', 'key42244', 'key42230', 'keyzz', 'kehh']}
它处理字典值列表中的任何嵌套深度。
这是一个内衬:
考虑这个字典,相同的结构:
m = {'a': ['k1', 'k2', 'k3', ['k4'], ['k5'], ['k6']],
'b': ['k1', 'k2', 'k3', ['k4'], ['k5'], ['k6']]}
import itertools
d = {k:list(itertools.chain.from_iterable(itertools.repeat(x,1) if isinstance(x, str) else x for x in v)) for k,v in m.iteritems()}
{'a': ['k1', 'k2', 'k3', 'k4', 'k5', 'k6'],
'b': ['k1', 'k2', 'k3', 'k4', 'k5', 'k6']}
您也可以使用第三方库 more-iterools
,
t = {k: list(more_itertools.collapse(v, base_type=str)) for k,v in m.iteritems()}
{'a': ['k1', 'k2', 'k3', 'k4', 'k5', 'k6'],
'b': ['k1', 'k2', 'k3', 'k4', 'k5', 'k6']}
如果在你的字典中有统一的值很重要,也许你可以创建一个函数来删除所有的(多维)列表,然后再将它们添加到字典中?
def flatten_values(value):
if type(value) == list:
for i in value:
return i
希望这会有所帮助,无法将其添加到评论中,因为我没有足够的代表 ;)
如果您不介意使用第 3 方扩展,您可以使用 iteration_utilities.deepflatten
1 和字典理解:
>>> from iteration_utilities import deepflatten
>>> {key: list(deepflatten(value, ignore=str)) for key, value in migration_dict.items()}
{'30003': ['key43220', 'key42244', 'key42230', 'keyzz', 'kehh'],
'30005': ['key42750', 'key43119', 'key44103', 'key333', 'key444', 'keyxx']}
这会将您的值中的所有可迭代项目展平(字符串除外)。
1 免责声明:我是该库的作者
我有这样的字典:
migration_dict = {'30005': ['key42750','key43119', 'key44103', ['key333'],
['key444'], ['keyxx']], '30003': ['key43220', 'key42244','key42230',
['keyzz'], ['kehh']]}
我怎样才能将每个键的值展平以得到类似这样的东西:
migration_dict = {'30005': ['key42750','key43119', 'key44103', 'key333',
'key444', 'keyxx'], '30003': ['key43220', 'key42244','key42230',
'keyzz', 'kehh']}
for key in migration_dict:
for i in migration_dict[key]:
if type(i) == list:
migration_dict[key].remove(i)
for element in i:
migration_dict[key].append(element)
现在这个循环应该完成了。但是请注意,这仅在内部列表中没有更多列表时才有效。如果确实如此,那么您可能必须创建一个递归函数来为您将其展平。
您可以编写一个递归函数来展平值列表,并在字典理解中使用它来构建新字典:
def flatten(lst):
for x in lst:
if isinstance(x, list):
for y in flatten(x): # yield from flatten(...) in Python 3
yield y #
else:
yield x
migration_dict = {k: list(flatten(v)) for k, v in dct.items()}
print(migration_dict)
# {'30005': ['key42750', 'key43119', 'key44103', 'key333', 'key444', 'keyxx'], '30003': ['key43220', 'key42244', 'key42230', 'keyzz', 'kehh']}
它处理字典值列表中的任何嵌套深度。
这是一个内衬:
考虑这个字典,相同的结构:
m = {'a': ['k1', 'k2', 'k3', ['k4'], ['k5'], ['k6']],
'b': ['k1', 'k2', 'k3', ['k4'], ['k5'], ['k6']]}
import itertools
d = {k:list(itertools.chain.from_iterable(itertools.repeat(x,1) if isinstance(x, str) else x for x in v)) for k,v in m.iteritems()}
{'a': ['k1', 'k2', 'k3', 'k4', 'k5', 'k6'],
'b': ['k1', 'k2', 'k3', 'k4', 'k5', 'k6']}
您也可以使用第三方库 more-iterools
,
t = {k: list(more_itertools.collapse(v, base_type=str)) for k,v in m.iteritems()}
{'a': ['k1', 'k2', 'k3', 'k4', 'k5', 'k6'],
'b': ['k1', 'k2', 'k3', 'k4', 'k5', 'k6']}
如果在你的字典中有统一的值很重要,也许你可以创建一个函数来删除所有的(多维)列表,然后再将它们添加到字典中?
def flatten_values(value):
if type(value) == list:
for i in value:
return i
希望这会有所帮助,无法将其添加到评论中,因为我没有足够的代表 ;)
如果您不介意使用第 3 方扩展,您可以使用 iteration_utilities.deepflatten
1 和字典理解:
>>> from iteration_utilities import deepflatten
>>> {key: list(deepflatten(value, ignore=str)) for key, value in migration_dict.items()}
{'30003': ['key43220', 'key42244', 'key42230', 'keyzz', 'kehh'],
'30005': ['key42750', 'key43119', 'key44103', 'key333', 'key444', 'keyxx']}
这会将您的值中的所有可迭代项目展平(字符串除外)。
1 免责声明:我是该库的作者