【问题标题】:How to remove duplicate digits from integers in list如何从列表中的整数中删除重复的数字
【发布时间】:2019-12-23 05:35:09
【问题描述】:

我有这份清单

names = [ ["cat", 9112, "dog123", 5625], ["luck", 1232, "bad23"] ]

根据this question 我已经通过使用此代码完成了它

names = [ ["cat", 9112, "dog123", 5625], ["luck", 1232, "bad23"] ]
new = [[x for x in y if isinstance(x, int)] for y in names]

输出 -: [[9112, 5625], [1232]]


问题

现在我想删除这样的重复数字。

expected output -: [[912, 562], [123]]

我正在使用此代码,但它不起作用

m = sorted(list(set(new)))
print(m)

错误 -:

Traceback (most recent call last):    
   File "main.py", line 13, in <module>     
     m = sorted(list(set(new)))     
TypeError: unhashable type: 'list'

注意-:我只想保留最初的原始数字。(例如-:1232需要变成123而不是132

【问题讨论】:

  • 一旦你弄清楚了,你需要做的就是remove_dups(x) for x in y if instance(x, int)

标签: python python-3.x list


【解决方案1】:

列表是可变的;在 Python 中,可变容器是不可散列的。 set(names) 需要对 names 的元素进行散列以对它们进行排序,但您的 names 列表具有列表作为它的元素(["cat", 9112, "dog123", 5625]["luck", 1232, "bad23"]),因此它不能转换为 set

试试这个:

names = [ ["cat", 9112, "dog123", 5625], ["luck", 1232, "bad23"] ]

li = [[x for x in y if isinstance(x, int)] for y in names]
final = [["".join(sorted(set(str(x)), key=str(x).index)) for x in y] for y in li]
print(li)
print(final)

它给出以下输出:

[[9112, 5625], [1232]] 
[['912', '562'], ['123']] 

编辑:

此解决方案将提供所需的结果。 它可能不是最佳和最佳解决方案,并且 OP 没有提到任何与性能相关的内容。

【讨论】:

  • sorted(set(str(x)) 不会把 9112 变成 129 吗?
  • 再次检查我的答案,我正在使用不同的键进行排序! key=str(x).index
  • 我明白了。无论如何,有更有效的方法来实现这一点,而无需将数字转换为字符串stackoverflow.com/questions/25231218/…
  • key=str(x).index 效率低下,尽管对于这种特定情况可能没什么大不了的......
  • 我知道。我给了他一个快速的解决方案,还提到了进一步优化的可能性。
【解决方案2】:
names = [ ["cat", 9112, "dog123", 5625], ["luck", 1232, "bad23"],["123"] ]
updated_name=[]
for n_list in names:
    undated_n_list=[]
    for n in n_list:
        if type(n)==int:
            new_str = []
            for digit in str(n):
                if digit not in new_str:
                    new_str.append(digit)
            undated_n_list.append(int("".join(map(str, new_str))))
    if undated_n_list:
        updated_name.append(undated_n_list)
print(updated_name)

输出:

[[912, 562], [123]]

有点冗长,但希望对你有用。

【讨论】:

    【解决方案3】:

    这是一个将整数转换为具有唯一数字的函数:

    def to_uniq_digit_int(n):
          seen = set() # A set that collects seen digits
          result = 0
          for i in str(n): # A lazy way to iterate over digits in an integer
              if i not in seen:
                  seen.add(i)
                  # Since we are iterating from the most significant to the least significant, we can multiply the result by ten each time to move the integer one digit left
                  result = result * 10 + int(i)
          return result
    

    使用辅助函数可能有助于提高代码的可读性。

    【讨论】:

      【解决方案4】:

      您可以将单个列表传递给某个获取数字并删除重复值的函数

      names = [["cat", 9112, "dog123", 5625],["luck", 1232, "bad23"]]
      output = [no_duplicate(li) for li in names]
      
      def no_duplicate(li):
          no_str = [no for no in li if type(no)==int] #get the numbers
          newlist = []
          for number in no_str:
              number = list(dict.fromkeys([s for s in str(number)])) #remove duplicate from each number
              number = "".join(x for x in number) 
              newlist.append(int(number)) #append back to the list they belong
          return newlist
      

      输出

      [[912, 562], [123]]
      

      希望这会有所帮助:)

      【讨论】:

        【解决方案5】:

        最简单易懂的存档方法是:

        data  = [[9112, 5625], [1232]]
        
        for index, value in enumerate(data):
            for indexY, valueY in enumerate(value):
                data[index][indexY] = int("".join(list(set(valueY.__str__()))))
        
        print(data)
        

        输出:

        [[129, 256], [123]]
        

        上面的代码可能不是谈论排序数据的最佳结果。但你可能会发现下一段代码会有所帮助:

        def RemoveDuplicate(numbers):
        
            result = []
        
            [result.append(e) for e in str(numbers) if not e in result]
        
            return int("".join(result))
        
        data  = [[9112, 5625], [1232]]
        
        for index, value in enumerate(data):
            for indexY, valueY in enumerate(value):
                data[index][indexY] = RemoveDuplicate(valueY)
        
        print(data)
        

        输出

        [[912, 562], [123]]
        

        为了减少代码行数:

        result = [[RemoveDuplicate(item) for item in row] for row in data]
        
        print(result)
        

        输出

        [[912, 562], [123]]
        

        如果你想要更懒惰的东西:

        result = [[int("".join(list(dict.fromkeys(str(item))))) for item in row] for row in data]
        
        print(result)
        

        输出

        [[912, 562], [123]]
        

        How to Remove Duplicates From a Python List

        【讨论】:

          【解决方案6】:

          如果您需要这样做,我觉得整数中的数字顺序无关紧要。如果是这样,您可以使用 set 删除重复项,然后通过单行形成整数:

          [[int(''.join(list(set(str(i))))) for i in x] for x in new]
          

          【讨论】:

          猜你喜欢
          • 2014-06-02
          • 1970-01-01
          • 2013-06-06
          • 2021-01-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-22
          相关资源
          最近更新 更多