簡體   English   中英

重新格式化值具有類似dict的關系的dict

[英]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 ),並收集值,直到找到BC ,然后停止收集。 然后將我必須添加的內容添加到在其他地方聲明的列表中。 惡作劇。

我遇到了各種各樣的問題,其中最重要的是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)

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

每當嘗試進行涉及連續組的操作時,都應該考慮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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM