【问题标题】:Match with the last occurrence of same key in a dictionary?与字典中最后一次出现的相同键匹配?
【发布时间】:2022-01-23 21:13:29
【问题描述】:

我有以下输入:

test = [{1:"i am Mike"},{3:"i am 20 years old"},{1:"i live in greece"},{7:"i love pizza"},{9:"i love basketball"}]

我想找到每个键的第一次和最后一次出现,然后我想对第一次和最后一次出现之间的所有信息进行分组,更具体地说是字符串。 我想要以下输出:

test = [{1:"i am Mike i am 20 years old i live in greece"},{7:"i love pizza"},{9:"i love basketball"}]

【问题讨论】:

  • 如果有多个键多次出现怎么办?即,如果输入类似于[{1:...}, {3:...}, {1:...}, {3:...}]
  • 我认为在您的人为示例中,您应该拥有{1: "i am 20 years old"}
  • 不,我想要 1 之间的任何东西 .. 在我的问题中,如果有任何东西在例如这里我们有数字 3 这意味着我不会再有 3 ......所以我想从同一个分组数字到相同的数字
  • 你的代码在哪里,它到底有什么问题?给minimal reproducible example
  • 如果[{1:...}, ..., {1:...}, ..., {1:...}]又会怎样?你想连接整个字符串,还是连接第一对{1:...}, ..., {1:...},然后最后一个{1:...}独立存在?恐怕这个问题是不恰当的。

标签: python dictionary


【解决方案1】:

首先将结束索引与单独字典中的每个键相关联。然后将这些组合成不重叠的范围,标识每个范围的第一个键。最后从每个范围内的字典中提取字符串:

ends   = { k:i for i,d in enumerate(test,1) for k in d }
ranges = [(0,)]
ranges.extend( (k,start,ends[k]) for start,d in enumerate(test) 
                for k in d if start==ranges[-1][-1] )
merged = [ {g:" ".join(d[k] for d in test[s:e] for k in d)} 
           for g,s,e in ranges[1:] ]

输出:

print(merged)
[{1: 'i am Mike i am 20 years old i live in greece'}, 
 {7: 'i love pizza'}, 
 {9: 'i love basketball'}]

【讨论】:

  • 它没有问题!非常感谢!!!
【解决方案2】:

没有图书馆或任何花哨的方法:

test = [{1: "i am Mike"}, {3: "i am 20 years old"}, {1: "i live in greece"}, {7: "i love pizza"},
    {9: "i love basketball"}]

tracking = [] 
output_str = []
result = []
for d in test:
    key, value = tuple(d.items())[0]
    output_str.append(value)
    if key in tracking:
        start = tracking.index(key)
        result += [{k: v} for (k, v) in zip(tracking[:start], output_str[:start])]
        tracking = tracking[start:]
        output_str = output_str[start:]
        result.append({key: ''.join(output_str)})
        tracking.clear()
        output_str.clear()
    else:
        tracking.append(key)

result += [{k: v} for (k, v) in zip(tracking, output_str)]
print(result)

这不支持 1 2 2 4 1 它只会合并 2 2

【讨论】:

  • 它非常接近,但我尝试了这个[{1: "i am Mike"}, {2: "i am 20 years old"}, {2: "i live in greece"}, {7: "i love pizza"},{9: "i love basketball"}],但我没有看到数字 1
  • 修复了!一些字符... .
猜你喜欢
  • 1970-01-01
  • 2013-05-23
  • 2017-02-22
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 2015-01-23
  • 2016-06-01
  • 2022-11-23
相关资源
最近更新 更多