Python,删除重复项并根据条件获得最大值
想象以下内容作为输入:Python,删除重复项并根据条件获得最大值,python,regex,Python,Regex,想象以下内容作为输入: anna-1 anna anna-0 michael anna-2 michael anna-2 和我的预期输出: anna-1 anna anna-0 michael anna-2 michael anna-2 条件: 如果没有重复项,我们将打印字符串。考虑到重复总是包含 ->代码>结束,之后,我们将使用它的最大值的重复数。 循环浏览列表并检查字符串是否出现过多次。如果没有,请打印字符串 对于多次出现,请从字符串末尾开始检查最大数量。查找具有最大编号的索引。(如
anna-1
anna
anna-0
michael
anna-2
michael
anna-2
和我的预期输出:
anna-1
anna
anna-0
michael
anna-2
michael
anna-2
条件:
如果没有重复项,我们将打印字符串。考虑到重复总是包含<代码> ->代码>结束,之后,我们将使用它的最大值的重复数。
另一种方法可以是
-n
,最后,您可以使用拆分
或子字符串
- 如果出现的键为1,则打印字符串
- 否则将
+出现次数连接到键的末尾并打印它-
anna-1
anna-7001
在这种情况下,您可以使用常规的dict
,在插入部分后面使用一些逻辑
名称
子字符串和数字
子字符串,基于以下模式,我们假设每个输入如下:-
或只是
请查看该包的详细信息和确切语法,但这是我的
pattern=“(?P\w+(?P-\d*)”
是的
dict
确实是个好主意,我使用字典存储遇到的数字,并逐渐只保留每个输入遇到的最大值.items()
方法再次解析它们,以打印出所需的数据重新导入
输入=[“安娜-1”、“安娜”、“安娜-0”、“迈克尔”、“安娜-2”]
pattern=“(?P\w+(?P-\d*)?”
maxNumbers={}#记住每个名称的最大数目
#解析所有输入并将其拆分为名称和编号
对于输入中的项目:
结果=重新匹配(模式、项目)
#提取名称
名称=结果组(“名称”)
#提取数字(如果没有数字,则设置为零)
编号=结果组(“编号”)
如果数字==无:
数字=0
其他:
数字=整数(数字[1:])
#把数字存到字典里
如果名称不在maxNumbers中:
maxNumbers[名称]=编号
其他:
maxNumbers[名称]=最大值(maxNumbers[名称],编号)
#解析所有名称并打印其最大数量
对于名称,maxNumbers.items()中的maxNumber:
如果maxNumber==0:
印刷品(名称)
其他:
打印(名称+“-”+str(最大编号))
请注意,您没有指定在输入为
安娜
安娜-0
它应该打印安娜-0还是只打印安娜?但这一点你可以自己解决。这里有一个方法,在你尝试时使用措辞
from collections import defaultdict
# Assuming you input names into a list
l = ['anna-1', 'anna', 'anna-0', 'michael', 'anna-2']
# Place list into dictionary, with key as names
# and count as value
d = defaultdict(list)
for i in l:
name_cnt = i.split('-')
if len(name_cnt) > 1:
name, cnt = name_cnt
d[name].append(int(cnt))
else:
k = name_cnt[0] # no count
d[k].append(-1) # use default -1
# Show dictionary d
print(d)
# Show Desired Output
for k, cnts in d.items():
cnt = max(cnts)
if cnt == -1: # no versions of name
print(k)
else:
print(f'{k}-{cnt}')
输出
字典d
您可以将
defaultdict
与dict理解结合使用:
from collections import defaultdict
# data in question
data = """
anna-1
anna
anna-0
michael
anna-2"""
# defaultdict
dict_ = defaultdict(int)
dict_ = {name: (number if dict_[name] <= number else dict_[name])
for line in data.split("\n") if line
for name, duplicate in [line.split("-") if "-" in line else (line, 0)]
for number in [int(duplicate)]}
print(dict_)
从集合导入defaultdict
#有关数据
data=”“”
安娜-1
安娜
安娜-0
迈克尔
安娜-2“
#默认命令
dict=默认dict(int)
dict_uuz={name:(如果dict_uuz[name]则为数字)请显示代码以证明您自己尝试过解决它。欢迎Anna,通常建议您提供一个最小的可复制示例,以显示您迄今为止尝试过的内容。像您这样的问题可能会很快被否决。@Corentpane我尝试过许多不同的解决方案,例如split,然后切换到dict以消除重复but失败。这就是为什么我要等待别人从头开始做这件事,这样我才能理解思考解决问题的逻辑。@Theool谢谢你的建议。我确实会努力的。它永远不会是anna-0
,因为它通常是anna
和anna-1