我有一个看起来像这样的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
为止,然后停止收集。然后将我所拥有的内容附加到我在其他地方声明的列表中。广告恶心。
我遇到了各种各样的问题,其中最重要的是问题。我错过了以干净的方式迭代值的能力。总是,我似乎遇到了索引错误。
如果有人有任何想法/理念/评论,我将不胜感激。
答案 0 :(得分:1)
如下:
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
功能以匹配您的实际输入非常重要。
此外,变量名称远非最佳,但我不确定你在做什么 - 你应该能够(并且应该)给它们更合适的名字。
答案 1 :(得分:0)
可能不是你想要的顺序,但不要感谢进一步的头痛。
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']
答案 2 :(得分:0)
每当你尝试做一些涉及连续组的事情时,你应该想到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