我有这个清单
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
)
答案 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]]
答案 5 :(得分:1)
我认为整数的顺序无关紧要。如果是这样,您可以使用set来删除重复项,然后通过单线来形成整数:
[[int(''.join(list(set(str(i))))) for i in x] for x in new]