将字典项合并,如果它们的键具有相同的子串等于另一个键的完整字符串。

2024-06-16 08:58:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在有一本词典,其中有些条目是相关的。相互关联的项目总是遵循此处所示的模式:

{ "item" : { "foo" : "bar", "fizz" : "buzz"},
  "itemSuper" : { "boo" : "far", "bizz" : "fuzz"},
  "itemDuper" : { "omg" : "wtf", "rofl" : "lmao"}}

如您所见,所有相关字典的键都有一个共同的子串,该子串等于其中一个字典的完整键。我想浏览一下我的字典,它将这些相关组的所有内容合并到单个字典中,这些字典的键是完成匹配的子字符串。因此,最终目标是为所有这些群体提供这样的服务:

{ "item" : { "foo" : "bar", "fizz" : "buzz", "boo" : "far", "bizz" : "fuzz", "omg" : "wtf", "rofl" : "lmao"}}

子字符串总是键的前导部分,但在组之间可能是任意的。所以除了上面的"item", "itemSuper" and "itemDuper"之外,还有"thingy""thingySuper",和"thingyDuper",还有其他类似的。你知道吗

子字符串有三种可能的后缀;我们称它们为SuperDuperUber。我感兴趣的任何一组项目都可以包含其中的任何一个或全部三个,但没有其他可能出现的后缀。你知道吗


Tags: 项目字符串字典foobaritemomgfar
3条回答

我会这样做:

data = { "item" : { "foo" : "bar", "fizz" : "buzz"},
  "itemSuper" : { "boo" : "far", "bizz" : "fuzz"},
  "itemDuper" : { "omg" : "wtf", "rofl" : "lmao"}}
for key1 in list(data.keys()):
    for key2 in list(data.keys()):
        if key1!=key2 and key1 in key2:
            data[key1].update(data[key2])
            del data[key2]
print(data)

输出:

{'item': {'foo': 'bar', 'fizz': 'buzz', 'boo': 'far', 'bizz': 'fuzz', 'omg': 'wtf', 'rofl': 'lmao'}}

注意这个解决方案已经就位(它改变了data),我使用了for ... in list(...)——这是至关重要的,因为否则我将无法在循环内del。你知道吗

def recombine(k, substring):
    newd = dict()
    newk = dict()

    key = [i for i in k if (substring in i)]  # select out the strings which contains substring
    value = [k[i] for i in key]               # select out the corresponding value of target key
    for i in value: 
        for j in i.items():
            newk[j[0]] = j[1]
    newd[substring] = newk
    return newd

k = { "item" : { "foo" : "bar", "fizz" : "buzz"},
  "itemSuper" : { "boo" : "far", "bizz" : "fuzz"},
  "itemDuper" : { "omg" : "wtf", "rofl" : "lmao"}}
recombine(k, 'item')

输出

{'item': {'foo': 'bar',
  'fizz': 'buzz',
  'boo': 'far',
  'bizz': 'fuzz',
  'omg': 'wtf',
  'rofl': 'lmao'}}
dict_of_dict = {                                            
  "item" : { "foo" : "bar", "fizz" : "buzz"},      
  "itemSuper" : { "boo" : "far", "bizz" : "fuzz"},
  "itemDuper" : { "omg" : "wtf", "rofl" : "lmao"} 
} 
suffixes = {'Super', 'Duper', 'Uber'}

def get_base(key, suffix_lst):
    for suffix in suffix_lst:
        if key.endswith(suffix):
            return key[:-len(suffix)]
    return key    

res = {}
for k,d in dict_of_dict.items():  
    base = get_base(k, suffixes)
    res.setdefault(base, {}).update(d)      

print(res)

输出

{'item': {'foo': 'bar', 'fizz': 'buzz', 'boo': 'far', 'bizz': 'fuzz', 'omg': 'wtf', 'rofl': 'lmao'}}

相关问题 更多 >