重新格式化dict,其中值具有类似dict的关系

时间:2015-03-07 03:29:19

标签: python dictionary

我有一个看起来像这样的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),然后收集值,直到找到BC为止,然后停止收集。然后将我所拥有的内容附加到我在其他地方声明的列表中。广告恶心。

我遇到了各种各样的问题,其中最重要的是问题。我错过了以干净的方式迭代值的能力。总是,我似乎遇到了索引错误。

如果有人有任何想法/理念/评论,我将不胜感激。

3 个答案:

答案 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)

https://ideone.com/FeBDLA

['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