我是Python新手并注意到以下内容。
>>> 'D'*1
'D'
因此我想知道我们是否可以进行乘法并加入字符串(对于选择,元素只能是0或1)
>>> print(choice)
[1, 1, 1, 1]
>>> print(A)
['D', 'e', '0', '}']
我想要的输出是'De0}'
答案 0 :(得分:7)
你可以明确地压缩列表,多个,然后加入结果:
''.join([c * i for c, i in zip(A, choice)])
zip()
function将A
中的字符与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 comprehension与str.join
和zip
一起使用{{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个元素。