在不保留任何订单的情况下从列表列表中删除重复内容

Rit*_*iya 12 python

我在python中编写代码来查找整数的因子对.但是制作对也会产生反向对.我想在不导入任何模块的情况下使用简单的方法消除这些反向对.例如.

[[1, 200], [2, 100], [4, 50], [5, 40], [8, 25], [10, 20], [20, 10], [25, 8], [40, 5], [50, 4], [100, 2], [200, 1]]

输出应该是:

[[1, 200], [2, 100], [4, 50], [5, 40], [8, 25], [10, 20]]
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止所得到的:

N = []
J = []
F = []
Z = []
S = []
num = input("Enter no. of elements in list")
print ('Enter numbers')
prod = 1
for i in range(int(num)):
    n = input("num :")
    N.append(int(n))
for x in N:
    prod = prod*x
print (prod)
k = input("Enter no. of splits:")
for o in range(1,prod+1):
    if prod%o == 0:
        J.append(o)
        F.append(o)
print (J)

Z = [[a, b] for a in J for b in F if a*b == prod]
print (Z)
Run Code Online (Sandbox Code Playgroud)

Rak*_*esh 7

使用set删除重复.

例如:

lst = [[1, 200], [2, 100], [4, 50], [5, 40], [8, 25], [10, 20], [20, 10], [25, 8], [40, 5], [50, 4], [100, 2], [200, 1]]
lst = set([tuple(sorted(i)) for i in lst])      #Sort inner list and then use set
lst = list(map(list, lst))                      #Converting back to list
print(lst)
Run Code Online (Sandbox Code Playgroud)

输出:

[[8, 25], [4, 50], [1, 200], [10, 20], [2, 100], [5, 40]]
Run Code Online (Sandbox Code Playgroud)

  • 我不确定你是什么意思? (2认同)

Håk*_*Lid 5

如果输入较大,则使用集合而不是列表将具有显着的性能优势。

>>> unique = set(map(frozenset, pairs))
>>> unique
{frozenset({1, 200}),
 frozenset({10, 20}),
 frozenset({5, 40}),
 frozenset({2, 100}),
 frozenset({8, 25}),
 frozenset({4, 50})}
Run Code Online (Sandbox Code Playgroud)

内部集合必须是frozenset因为常规集合是可变的,并且集合只能包含不可变的子代。

转换回列表列表。

>>> list(map(list, unique))
[[200, 1], [10, 20], [40, 5], [2, 100], [8, 25], [50, 4]]
Run Code Online (Sandbox Code Playgroud)

集是可迭代的,因此根据您的用法,可能不需要此步骤。

这是一个同时执行两个步骤并将结果作为嵌套列表返回的函数。

def unique_pairs(pairs): 
    return list(map(list,set(map(frozenset, pairs))))
Run Code Online (Sandbox Code Playgroud)

请注意,将列表转换为集合会将包含相同对(例如[20,20])的列表转换为单个元素集({20})。因此,如果您的输入可以包含相同的对,则可能需要执行额外的最后一步,将单例扩展回对。

def unique_pairs(pairs):
    return [(2*[*p])[:2] for p in set(map(frozenset,pairs))]
Run Code Online (Sandbox Code Playgroud)

这将适用于双胞胎对和混合对。

>>> pairs = [[10, 2], [2, 10], [10, 10], [2, 2]]
>>> unique_pairs(pairs)
[[10, 10], [2, 2], [10, 2]]
Run Code Online (Sandbox Code Playgroud)


Sun*_*tha 4

>>> l = [[1, 200], [2, 100], [4, 50], [5, 40], [8, 25], [10, 20], [20, 10], [25, 8], [40, 5], [50, 4], [100, 2], [200, 1]]
>>> new_l = []
>>> for e in l:
...     if e not in new_l and sorted(e) not in new_l:
...         new_l.append(e)
... 
>>> new_l
[[1, 200], [2, 100], [4, 50], [5, 40], [8, 25], [10, 20]]
>>> 
Run Code Online (Sandbox Code Playgroud)

  • 如果性能很重要,那么这个解决方案并不理想。对于使用集合而不是列表的解决方案,O(n^2) 与 O(n) 相比。如果您的输入很小,这可能不会被注意到,但对于大输入,这可能会非常慢。 (5认同)