Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python,删除重复项并根据条件获得最大值_Python_Regex - Fatal编程技术网

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