我在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)
使用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)
如果输入较大,则使用集合而不是列表将具有显着的性能优势。
>>> 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)
>>> 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)