我想实现一个处理以下数据的函数:'d'并生成'L'。如何实现?
def func(**d):
'do something'
return [....]
来源:
d = {'a': 1, 'b': 2, 'c': [3, 4, 5]}
或
d = {'a': 1, 'b': 2, 'c': [3, 4, 5], 'd': [6, 7]}
TO:
L=[{'a':1,'b':2,'c':3},
{'a':1,'b':2,'c':4},
{'a':1,'b':2,'c':5}]
或
L=[{'a': 1, 'b': 2, 'c': 3, 'd': 6},
{'a': 1, 'b': 2, 'c': 3, 'd': 7},
{'a': 1, 'b': 2, 'c': 4, 'd': 6},
{'a': 1, 'b': 2, 'c': 4, 'd': 7},
{'a': 1, 'b': 2, 'c': 5, 'd': 6},
{'a': 1, 'b': 2, 'c': 5, 'd': 7}]
答案 0 :(得分:1)
pattern1 = re.compile(r'<span\sclass="count">[^<\d]*(\d+)[^<\d]*</', re.S)
基本上,我在这里做的是:
在这种情况下的示例:
d = {'a': 1, 'b': 2,' c': [3, 4, 5]}
temp_d = d
L = []
for key in temp_d:
item = {}
for key in temp_d:
if isinstance(temp_d[key], list):
item[key] = temp_d[key].pop(0)
else:
item[key] = temp_d[key]
L.append(item)
等到最后。
答案 1 :(得分:0)
这适用于python 3:
d = {'a': 1, 'b': 2, 'c': [3, 4, 5]}
def f(**d):
return [{**d, 'c': i} for i in d.pop('c')]
答案 2 :(得分:0)
您的问题可以解决如下:
from itertools import cycle
def func(indict):
dictlist = [dict(indict)] # make copy to not change original dict
for key in indict: # loop keys to find lists
if type(indict[key]) == list:
listlength = len(indict[key])
dictlist = listlength * dictlist # elements are not unique
for dictindex, listelement in zip(range(len(dictlist)), cycle(indict[key])):
dictlist[dictindex] = dict(dictlist[dictindex]) # uniquify
dictlist[dictindex][key] = listelement # replace list by list element
return dictlist
在一般情况下,你的dict中可以有多个列表。我的解决方案假设您要展开所有这些。
查看解决方案的详细信息,首先将原始字典的副本添加到dictlist
然后循环元素,每当找到列表时,它会将dictlist
与找到的列表的长度。这将确保dictlist
包含正确数量的元素。
但是,元素不会是唯一的,因为它们将引用相同的基础dicts。
为了解决这个问题,dict列表的元素是&#34; unquified&#34;通过循环列表并用自身的副本替换每个元素,原始indict
中的列表被列表中的每个元素替换,循环dictlist
的不同元素。
我知道我的解释有点乱。对此我很抱歉,但我发现很难用简短的方式解释。
此外,列表中元素的顺序与您在问题中要求的顺序不同。由于dict的各个键值对没有排序,因此无法确保元素将被展开的顺序,这也导致列表顺序也无法确保。