将列表中的一个元素与列表中的所有其他元素相除

时间:2020-03-14 12:49:42

标签: python

我想从用户那里获取一个数字列表和一个值(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

如何调整代码?谢谢!

7 个答案:

答案 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')

注意

  1. 您可以循环浏览list1,而无需显式使用索引。
  2. 您将需要在for循环中使用break语句。仅当for循环未由任何break语句终止时,关联的else部分才会执行。

请注意,即使有多对可能导致除法后产生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)

...

相关问题