如何从列表中的整数中删除重复的数字

时间:2019-12-23 05:35:09

标签: python python-3.x list

我有这个清单

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

6 个答案:

答案 0 :(得分:5)

列表是可变的;在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并未提及与性能相关的任何内容。

答案 1 :(得分: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]]

它有点长,但希望它对您有用。

答案 2 :(得分:2)

这是将整数转换为具有唯一数字的整数的功能:

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

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

答案 3 :(得分:2)

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

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]]

希望这会有所帮助:)

答案 4 :(得分:1)

存档的最简单方法是:

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

答案 5 :(得分:1)

我认为整数的顺序无关紧要。如果是这样,您可以使用set来删除重复项,然后通过单线来形成整数:

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