我有一个python字典列表,如下所示:
[{'category': 'software', 'name': 'irssi', 'version': '1.2.0'},
{'category': 'software', 'name': 'irssi', 'version': '1.1.2'},
{'category': 'software', 'name': 'hexchat', 'version': '2.14.2'}](解析部分数据txt文件)
我想做的是:
如果类别和名称相同,我希望保留包条目的第一个外观,并删除其余的,因此最终输出将如下所示:
[{'category': 'software', 'name': 'irssi', 'version': '1.2.0'},
{'category': 'software', 'name': 'hexchat', 'version': '2.14.2'}]我应该如何实现这一点?我尝试将字典列表转换为字典,然后使用dict.items()对其进行迭代,但没有成功。
发布于 2019-03-24 02:56:11
使用itertools.groupby,取每组中的第一个:
def uniq(lst):
for _, grp in itertools.groupby(lst, lambda d: (d['category'], d['name'])):
yield list(grp)[0]
lst = [{'category': 'software', 'name': 'irssi', 'version': '1.2.0'},
{'category': 'software', 'name': 'irssi', 'version': '1.1.2'},
{'category': 'software', 'name': 'hexchat', 'version': '2.14.2'}]
print(list(uniq(lst))发布于 2019-03-24 02:55:13
使用set跟踪您已经看到的所有(category, name)对:
lst = [
{'category': 'software', 'name': 'irssi', 'version': '1.2.0'},
{'category': 'software', 'name': 'irssi', 'version': '1.1.2'},
{'category': 'software', 'name': 'hexchat', 'version': '2.14.2'}
]
seen = set()
result = []
for dic in lst:
key = (dic['category'], dic['name'])
if key in seen:
continue
result.append(dic)
seen.add(key)
print(result)
# output: [{'category': 'software', 'name': 'irssi', 'version': '1.2.0'},
# {'category': 'software', 'name': 'hexchat', 'version': '2.14.2'}]这可以概括为一个函数:
def keep_first(iterable, key=None):
if key is None:
key = lambda x: x
seen = set()
for elem in iterable:
k = key(elem)
if k in seen:
continue
yield elem
seen.add(k)>>> list(keep_first(lst, lambda d: (d['category'], d['name'])))
[{'category': 'software', 'name': 'irssi', 'version': '1.2.0'},
{'category': 'software', 'name': 'hexchat', 'version': '2.14.2'}]发布于 2019-03-24 03:23:16
假设您想要保留最新版本,您可以创建一个字典,其中包含每个类别/名称对的最新版本的软件信息。然后从该字典中获取值列表:
software = [{'category': 'software', 'name': 'irssi', 'version': '1.2.0'},
{'category': 'software', 'name': 'irssi', 'version': '1.1.2'},
{'category': 'software', 'name': 'hexchat', 'version': '2.14.2'}]
lastVersion = dict()
for softInfo in software:
key = (softInfo['category'],softInfo['name'])
if key not in lastVersion or lastVersion[key]['version'] < softInfo['version']:
lastVersion[key] = softInfo
software = list(lastVersion.values())
print(software)
# [{'category': 'software', 'name': 'irssi', 'version': '1.2.0'},
# {'category': 'software', 'name': 'hexchat', 'version': '2.14.2'}]https://stackoverflow.com/questions/55317251
复制相似问题