将列表的所有元素相互相乘一次,而不是与它们相乘

Multiply all elements of a list with each other once and not with themselfs

提问人:andypappy 提问时间:7/1/2023 最后编辑:Nick ODellandypappy 更新时间:7/5/2023 访问量:64

问:

我编写了这段代码来将列表的所有元素(如 [a,b,c])相互相乘,而不是与它们相乘,结果是这个列表: [a*b,a*c,b*a,b*c,c*a,c*b]。 我只想用以下命令填充结果列表: [a*b、a*c、b*c] 因为其余的都是相反的重复。 有人可以帮我一把,因为我无法弄清楚这一点! 提前非常感谢!

这是我的代码:

a = []
#list = [1,2,3,4,5]
def myf(a,b) :
    m = a * b
    return m


for i in range(1,6) : # or list 
    for z in range(1,6) : # or list
        if i  != z :
            val = myf(i,z)
            a.append(val)


print(a)

结果是 [2,3,4,5,2,6,8,10,3,6,12,15,4,8,12,20,5,10,15,20] 当我想要 [2,3,4,5,6,8,10,12,15,20]

python list for 循环 嵌套

评论

0赞 jasonharper 7/1/2023
使用集合而不是列表来累积结果,并且不会有任何重复项。
1赞 Andrej Kesely 7/1/2023
将第二个循环更改为并删除该条件。for z in range(i+1,6):if
0赞 cards 7/1/2023
with you 推断出 not 的排序 [在这种情况下,两个范围是相同的!i < z!=

答:

0赞 Zero 7/1/2023 #1

您在第一个和第二个循环中遍历相同的元素。

您可以通过跳过第 2 个循环中的值来过滤遍历的值,第 1 个循环已经覆盖了该值。

更新的代码是。

a = []
#list = [1,2,3,4,5]
def myf(a,b) :
    m = a * b
    return m

for i in range(1,6) : # or list 
    for z in range(i+1,6) : # or list
        if i  != z :
            val = myf(i,z)
            a.append(val)

print(a)

输出为

[2, 3, 4, 5, 6, 8, 10, 12, 15, 20]

评论

0赞 slothrop 7/1/2023
您可以删除那里,因为它总是大于您设置循环的方式。if i != zzi
0赞 Zero 7/1/2023
是的,@slothrop,为了更容易理解,我对 OPs 代码进行了最低限度的编辑。
0赞 andypappy 7/1/2023
这很棒,因为可以在 myf 中进行任何计算并获得配对结果列表!
0赞 Maria K 7/1/2023 #2

您可以开始第二次迭代,而不是从 1 开始,而是从第一个值开始,以便您要乘以的所有对都按递增顺序排列。诸如此类:

a = []
lst = [1,2,3,4,5]

for i, value1 in enumerate(lst):
    for value2 in lst[i + 1:]:
        a.append(value1 * value2)

print(a)

输出:

[2, 3, 4, 5, 6, 8, 10, 12, 15, 20]

这里返回当前元素的索引和值对。我们需要索引从 hich 元素中知道,以开始迭代第二个值。enumerate

lst[i + 1:]仅返回从数组末尾到末尾的元素。(i + 1)th

1赞 sahasrara62 7/1/2023 #3

你要做的是没有重复的组合

这可以作为

from itertools import combinations
l = [1,2,3,4,5]
result = [a*b for a, b in combinations(l, 2)] # 2 is size of combination of list element you want

print(result)

如果不使用此函数,则期望对于当前元素/值索引,您计算索引大于它的元素/值。这可以像

>>> result = []
>>> l = [1,2,3,4,5,6]
>>> for i, v in enumerate(l):
        for j, v2 in enumerate(l[i+1:]):                                             
            result.append(v*v2)                                              
>>> result
[2, 3, 4, 5, 6, 6, 8, 10, 12, 12, 15, 18, 20, 24, 30]

评论

0赞 andypappy 7/1/2023
很棒的替代方法,,谢谢。
0赞 8823 7/1/2023 #4

你可以试试这个

list_a = [1,2,3,4,5]
map_list = []
for i in list_a.copy():
  multiplier = list_a.pop(0)
  map_list.extend(list(map(lambda x: x * multiplier, list_a)))

输出是

[2, 3, 4, 5, 6, 8, 10, 12, 15, 20]
0赞 Willy 7/1/2023 #5

另一种方法


def multiply_list_elements(lst):
    product = 1
    for num in lst:
        product *= num
    
    result = product
    for num in lst:
        result /= num
    
    return result

# Example usage
my_list = [2, 3, 4, 5]
result = multiply_list_elements(my_list)
print(result)


第一个循环将计算列表中所有元素的乘积。

第二个循环消除了自乘法,确保所有元素都乘以除其自身之外的所有其他元素。

0赞 Alain T. 7/5/2023 #6

您可以使用两级列表推导式,第一级枚举元素,直到倒数第二个元素,第二级获取后续项目:

L = [1,2,3,4,5]

R = [a*b for i,a in enumerate(L,1) for b in L[i:]]

print(R)
[2, 3, 4, 5, 6, 8, 10, 12, 15, 20]