Python乘法两列表

时间:2014-09-12 09:08:57

标签: python python-3.x

我是Python新手并注意到以下内容。

>>> 'D'*1
'D'

因此我想知道我们是否可以进行乘法并加入字符串(对于选择,元素只能是0或1)

>>> print(choice)
[1, 1, 1, 1]
>>> print(A)
['D', 'e', '0', '}']

我想要的输出是'De0}'

2 个答案:

答案 0 :(得分:7)

你可以明确地压缩列表,多个,然后加入结果:

''.join([c * i for c, i in zip(A, choice)])

zip() functionA中的字符与choice中的整数配对,然后列表推导将字符与整数相乘,str.join() call将结果与itertools.compress()结合起来把它变成一个字符串。

如果使用choice 用于选择元素,则最好在此处使用{{3}}:

from itertools import compress

''.join(compress(A, choice))

compress()完全按照您的意图执行操作:从第一个可迭代中选择元素,而不是第二个可迭代中的相应值为true或false。

演示:

>>> choice = [1, 1, 1, 1]
>>> A = ['D', 'e', '0', '}']
>>> ''.join([c * i for c, i in zip(A, choice)])
'De0}'
>>> choice = [0, 1, 0, 1]
>>> ''.join([c * i for c, i in zip(A, choice)])
'e}'
>>> from itertools import compress
>>> ''.join(compress(A, choice))
'e}'

使用itertools.compress()更快选项:

>>> import timeit
>>> import random
>>> A = [chr(random.randrange(33, 127)) for _ in range(1000)]
>>> choice = [random.randrange(2) for _ in range(1000)]
>>> def with_mult(A, choice):
...     return ''.join([c * i for c, i in zip(A, choice)])
... 
>>> def with_compress(A, choice):
...     return ''.join(compress(A, choice))
... 
>>> timeit.timeit('f(A, choice)', 'from __main__ import A, choice, with_mult as f', number=10000)
1.0436905510141514
>>> timeit.timeit('f(A, choice)', 'from __main__ import A, choice, with_compress as f', number=10000)
0.2727453340048669

速度提高了4倍。

答案 1 :(得分:5)

您可以list comprehensionstr.joinzip一起使用{{3}}。请参阅下面的示例:

choice = [1, 1, 1, 0]
A = ['D', 'e', '0', '}']

out = ''.join([n*c for n, c in zip(choice, A)])

print(out)
# De0

由于选择的第4个元素为0,因此不会打印A('}')的第4个元素。