将列表元素与同一列表中的其他元素相乘

时间:2017-02-17 02:06:14

标签: python python-2.7

我想将列表元素与所有其他元素相乘。

例如:

def product(a,b,c):
    return (a*b, a*c, a*b*c)

我已经完成了这个

def product(*args):
    list = []
    for index,element in enumerate(args):
        for i in args:
            if (args[index]*i) not in list:
                list.append(args[index]*i)
    return list

但这会给我[a*a, a*b,a*c, b*b]等。我不希望a*ab*bc*c位在那里。

4 个答案:

答案 0 :(得分:0)

itertools is your friend此处:

from itertools import combinations
from functools import reduce, partial
from operator import mul

# Make a sum-like function for multiplication; I'd call it product,
# but that overlaps a name in itertools and our own function
multiplyall = partial(reduce, mul)

def product(*args):
    # Loop so you get all two elements combinations, then all three element, etc.
    for n in range(2, len(args) + 1):
        # Get the combinations for the current combo count
        for comb in combinations(args, n):
            # Compute product and yield it
            # yielding comb as well just for illustration
            yield comb, multiplyall(comb)

我把它变成了一个生成器函数,因为坦率地说,几乎所有只是按元素慢慢构建一个列表元素并返回它的函数应该是一个生成器函数(如果调用者想要一个列表,他们只是做{ {1}}),当传递许多参数时,可以更容易地迭代使用而不会破坏主存储器。

使用示例:

mylist = list(generatorfunc(...))

哪个输出:

>>> for pieces, prod in product(2, 3, 4):
        print ' * '.join(map(str, pieces)), '=', prod

答案 1 :(得分:0)

你可以检查是否平等

2 * 3 = 6
2 * 4 = 8
3 * 4 = 12
2 * 3 * 4 = 24

答案 2 :(得分:0)

因此,如果值为2, 3, 4, 5,则您需要所有且仅需要这些产品:

2*3=6, 2*4=8, 2*5=10, 2*3*4=24, 2*3*5=30, 2*4*5=40, 2*3*4*5=120

这意味着获取3, 4, 5的所有组合,然后将它们与2相乘。 itertools模块具有combinations功能,reduce可与operator.mul结合使用以进行计算:

def product(first, *other):
    for n in range(1, len(other) + 1):
        for m in combinations(other, n):
            yield reduce(mul, m, first)

list(product(2, 3, 4, 5))

输出:

[6, 8, 10, 24, 30, 40, 120]

答案 3 :(得分:0)

您的列表是否包含重复的元素,例如[2, 3, 4, 2]

如果没有,这是一个班轮:

首先,使用标签来说明模式:

a = ['a1','a2','a3']

lsta = [[x+y for y in [z for z in a if z != x]] for x in a]
lsta

[['a1a2', 'a1a3'], ['a2a1', 'a2a3'], ['a3a1', 'a3a2']]

这里有数字:

a =[2,3,4,5]

print  [[x*y for y in [z for z in a if z != x]] for x in a]

[[6, 8, 10], [6, 12, 15], [8, 12, 20], [10, 15, 20]]

或产品的总和,如果您愿意:

a =[2,3,4,5]

print  [sum([x*y for y in [z for z in a if z != x]]) for x in a]

[24, 33, 40, 45]

如果列表有重复,则会变得更复杂。您是否希望单独计算2[2,3,4,2]的第一次出现和第二次出现(出于某些目的,您可能需要这样做,即使两者都得到相同的值)?