我想从用户那里获取一个数字列表和一个值(v),看看列表中的一个元素除以另一个元素是否等于v:
例如
user input:[ 9, 5, 8, 1 ], v = 10, result: false
user input:[ 2, 4, 5, 7 ], v = 2, result: 2 and 4
user input: [ 3, 5, 15, 20 ] v = 4, result: 5 and 20
下面是我现在所拥有的:
listnum = input("Enter a list of numbers: ")
list1 = []
v = int(input("Enter the value of v: "))
listnum = listnum.split()
for num in listnum:
list1.append(num)
for a in range(len(list1)):
for b in range(len(list1)):
if int(list1[a])/int(list1[b]) == v:
print(list1[b], list1[a])
else:
print('False')
但是我的输出是:
Enter a list of numbers: 2 4 5 7
Enter the value of v: 2
2 4
False
如何调整代码?谢谢!
答案 0 :(得分:1)
在这里:
from itertools import combinations
listnum = input("Enter a list of numbers: ")
list1 = []
v = int(input("Enter the value of v: "))
listnum = map(int, listnum.split())
combs = combinations(listnum, 2)
divisors = [(n1, n2) for n1, n2 in combs if n1/n2 == v or n2/n1 == v]
if len(divisors) == 0:
print(False)
else:
print(divisors)
Enter a list of numbers: 3 5 15 20
Enter the value of v: 4
[(5, 20)]
答案 1 :(得分:0)
尝试一下:
listnum = input("Enter a list of numbers: ")
list1 = []
v = int(input("Enter the value of v: "))
listnum = listnum.split()
for num in listnum:
list1.append(int(num))
found=False
for a in list1:
for b in list1:
if a/b == v:
print(b,a)
found=True
break
if found:
break
else:
print('False')
注意:
list1
,而无需显式使用索引。 请注意,即使有多对可能导致除法后产生v
,以上代码段也只会打印第一对。
答案 2 :(得分:0)
您有一个缩进问题,您的else条件无法按预期工作。 如果未找到结果时要打印False,则可以执行以下操作:
exists = False
for a in range(len(list1)):
for b in range(len(list1)):
if int(list1[a])/int(list1[b]) == v:
print(list1[b], list1[a])
exists = True
if not exists:
print('False')
答案 3 :(得分:0)
您可以使用标志来确定列表中元素除以另一个元素是否等于v,就像这样
listnum = input("Enter a list of numbers: ")
v = int(input("Enter the value of v: "))
listnum = listnum.split()
isDevided=False
for a in range(len(listnum)):
for b in range(len(listnum)):
if int(listnum[a])/int(listnum[b]) == v:
print(listnum[b], listnum[a])
isDevided=True
if isDevided==False:
print ("False")
我要提到的另一件事是,您正在使用list1
作为额外变量和额外的for循环,这可能会降低性能。以上代码在内存和计算方面进行了优化。
答案 4 :(得分:0)
一些优化版本:
listnum = input("Enter a list of numbers: ")
list1 = []
v = int(input("Enter the value of v: "))
listnum = sorted(list(map(int, listnum.split())), reverse=True)
if(v<2): print("False")
else:
for i in range(len(listnum)):
if(listnum[i]%v==0):
for j in range(i+1, len(listnum)):
if(listnum[i] == v*listnum[j]):
list1.append((listnum[i], listnum[j]))
if(len(list1)==0): print("False")
else: print(list1)
一些笔记-我在这里做什么:
(1)使其更容易-按降序对输入数组进行排序。因此,您不必在整个列表上运行两次,而只需在第二步中运行提醒(仍然是O(n^2)
,但操作少了2倍)。
(2)如果v
是大数的除数,则只需要通过提醒执行查找-否则无论如何您将找不到小数。
总体而言-根据输入示例-您应该会在此代码上看到一些重大的性能改进。
答案 5 :(得分:0)
您可以使用列表推导以更紧凑的方式执行此操作。通过计算结果产品的列表(数字* v),您可以使用一组仅遍历该列表两次,而不是对列表中的每个数字都进行遍历。这将为您带来O(n)的复杂度,而不是O(n ^ 2)。
numbers = input("Enter a list of numbers: ")
numbers = list(map(int,numbers.split(",")))
value = int(input("Enter the value of v: "))
products = { divisor*value for divisor in numbers }
matches = [ number for number in numbers if number in products ]
print( ", ".join(f"{prod}/{prod//value}" for prod in matches) or "False")
示例运行:
Enter a list of numbers: 9,5,8,1
Enter the value of v: 10
False
Enter a list of numbers: 2,4,5,7
Enter the value of v: 2
4/2
Enter a list of numbers: 3,5,15,20
Enter the value of v: 4
20/5
Enter a list of numbers: 5,10,15,30,45
Enter the value of v: 3
15/5, 30/10, 45/15
请注意,需要处理一些特殊情况(列表中的零或重复项或v == 1),但是由于您的原始代码不会干扰那些我认为不属于问题语句的代码
这是一个更精简的版本:
nums = map(int,input("Enter a list of numbers: ").split(","))
v = int(input("Enter the value of v: "))
print(*([f"{n}/{n//v}" for s in [set(nums)] for n in s if n//v in s] or "False"))
答案 6 :(得分:0)
尝试一下
a=input("Enter list of numbers Like 2 4 5 1: ")
v= float(input("Enter the value of v: "))
a= a.split()
b = [int(a[i]) for i in range(len(a))]
b = sorted(b)
final_list = []
for i in b:
if i not in final_list:
final_list.append(i)
count = 0
for i in range(len(final_list)):
for j in final_list[i+1:]:
if int(j) / int(final_list[i]) == v:
print(final_list[i], " and ", j)
count += 1
if count == 0:
print(False)
...