提问人:andypappy 提问时间:7/1/2023 最后编辑:Nick ODellandypappy 更新时间:7/5/2023 访问量:64
将列表的所有元素相互相乘一次,而不是与它们相乘
Multiply all elements of a list with each other once and not with themselfs
问:
我编写了这段代码来将列表的所有元素(如 [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]
答:
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 != z
z
i
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]
评论
for z in range(i+1,6):
if
i < z
!=