[英]Reformatting a dict where the values have a dict-like relationship
我有一個defaultdict看起來像這樣:
d = { 'ID_001': ['A', 'A_part1', 'A_part2'],
'ID_002': ['A', 'A_part3'],
'ID_003': ['B', 'B_part1', 'B_part2', 'A', 'A_part4'],
'ID_004': ['C', 'C_part1', 'A', 'A_part5', 'B', 'B_part3']
}
在繼續之前,我不得不說A_part1
不是真正的字符串-字符串實際上是一堆字母數字字符; 我這樣表示是為了表明A_part1
是與A
關聯的文本,如果您明白我的意思。)
退后一步看看,我真正擁有的是一個dict,其中值具有其自己的鍵/值關系,但是該關系僅以它們在列表中出現的順序存在。
我試圖結束這樣的事情:
['ID_001 A A_part1, A_part2',
'ID_002 A A_part3',
'ID_003 B B_part1 B_part2',
'ID_003 A A_part4',
'ID_004 C C_part1',
'ID_004 A A_part5',
'ID_004 B B_part3']
我做了各種各樣的嘗試; 我一直想遍歷dict的值,記下第一個位置的字符(例如A
),並收集值,直到找到B
或C
,然后停止收集。 然后將我必須添加的內容添加到在其他地方聲明的列表中。 惡作劇。
我遇到了各種各樣的問題,其中最重要的是code腫的代碼。 我缺少以干凈的方式遍歷值的能力。 我似乎總是遇到索引錯誤。
如果有人有任何想法/理念/評論,我將不勝感激。
怎么樣呢?
d = { 'ID_001': ['A', 'A_part1', 'A_part2'],
'ID_002': ['A', 'A_part3'],
'ID_003': ['B', 'B_part1', 'B_part2', 'A', 'A_part4'],
'ID_004': ['C', 'C_part1', 'A', 'A_part5', 'B', 'B_part3']
}
def is_key(s):
return s in ['A','B','C']
out = {}
for (k,v) in d.iteritems():
key = None
for e in v:
if is_key(e): key = e
else:
out_key = (k,key)
out[out_key] = out.get(out_key, []) + [e]
產生:
{('ID_001', 'A'): ['A_part1', 'A_part2'],
('ID_002', 'A'): ['A_part3'],
('ID_003', 'A'): ['A_part4'],
('ID_003', 'B'): ['B_part1', 'B_part2'],
('ID_004', 'A'): ['A_part5'],
('ID_004', 'B'): ['B_part3'],
('ID_004', 'C'): ['C_part1']}
重要的是更新is_key
函數以匹配您的實際輸入。
另外,變量名遠非最佳,但我不確定自己在做什么—您應該(並且應該)給它們提供更合適的名稱。
可能不是您想要的順序,但是不要再擔心了。
d = { 'ID_001': ['A', 'A_part1', 'A_part2'],
'ID_002': ['A', 'A_part3'],
'ID_003': ['B', 'B_part1', 'B_part2', 'A', 'A_part4'],
'ID_004': ['C', 'C_part1', 'A', 'A_part5', 'B', 'B_part3']
}
rst = []
for o in d:
t_d={}
for t_o in d[o]:
if not t_o[0] in t_d:
t_d[t_o[0]] = [t_o]
else: t_d[t_o[0]].append(t_o)
for t_o in t_d:
rst.append(' '.join([o,t_d[t_o][0],', '.join(t_d[t_o][1:])]))
print(rst)
['ID_004 C C_part1', 'ID_004 A A_part5', 'ID_004 B B_part3', 'ID_003 A A_part4', 'ID_003 B B_part1, B_part2', 'ID_002 A A_part3', 'ID_001 A A_part1, A_part2']
每當嘗試進行涉及連續組的操作時,都應該考慮itertools.groupby
。 您對將組分隔開的條件不是很明確,但是如果我們將“第一個位置的字符”作為面值:
from itertools import groupby
new_list = []
for key, sublist in sorted(d.items()):
for _, group in groupby(sublist, key=lambda x: x[0]):
new_list.append(' '.join([key] + list(group)))
產生
>>> for elem in new_list:
... print(elem)
...
ID_001 A A_part1 A_part2
ID_002 A A_part3
ID_003 B B_part1 B_part2
ID_003 A A_part4
ID_004 C C_part1
ID_004 A A_part5
ID_004 B B_part3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.