如何在 Python 中按顺序获取列表元素的所有串联?
How to get all concatenation of list elements in order in Python?
背景
我有数字和符号列表,例如:
[1,':',2022,'.','01','.','01']
我想在每个元素按顺序串联时调用类似 is_date(string)
的函数。
最小示例
考虑将简单示例 [1,2,3]
作为输入,预期的串联列表应为:['1','12','2','123','23','3']
我不想在结果中得到 '13'
所以之后我可以打电话给:
for token in list_of_concatenation:
if is_date(token):
do something
您不是寻找itertools.powerset() recipe因为它忽略了“顺序”:
from itertools import chain, combinations
# source: https://docs.python.org/3/library/itertools.html
def powerset(iterable):
"powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
s = list(iterable)
# use range(1, len(s)+1) to avoid empty result -> comment @mozway
return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
d = [1,2,3]
print(list(powerset(d)))
wich returns 元组作为迭代器(我列出):
[(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
您可以过滤结果以删除空元组并使用
将元组转换为字符串
result = [''.join(map(str, tup)) for tup in powerset(d) if tup]
打印(结果)
获得
['1', '2', '3', '12', '13', '23', '123']
- 对于效率不高的解决方案,您可以使用它来筛选出您真正想要的。
您可以使用双循环、切片和字符串连接:
l = [1, 2, 3]
l2 = [str(x) for x in l]
[''.join(l2[i:j+1]) for i in range(len(l2)) for j in range(i, len(l2))]
输出:['1', '12', '123', '2', '23', '3']
嵌套 for 循环怎么样:
sample = [1,':',2022,'.','01','.','01']
sample_str = [str(s) for s in sample]
for ix, i in enumerate(sample_str):
for j in range(ix, len(sample_str)):
print(''.join(sample_str[ix:j+1]))
输出:
1
1:
1:2022
1:2022.
1:2022.01
1:2022.01.
1:2022.01.01
:
:2022
:2022.
:2022.01
:2022.01.
:2022.01.01
2022
2022.
2022.01
2022.01.
2022.01.01
.
.01
.01.
.01.01
01
01.
01.01
.
.01
01
背景
我有数字和符号列表,例如:
[1,':',2022,'.','01','.','01']
我想在每个元素按顺序串联时调用类似 is_date(string)
的函数。
最小示例
考虑将简单示例 [1,2,3]
作为输入,预期的串联列表应为:['1','12','2','123','23','3']
我不想在结果中得到 '13'
所以之后我可以打电话给:
for token in list_of_concatenation:
if is_date(token):
do something
您不是寻找itertools.powerset() recipe因为它忽略了“顺序”:
from itertools import chain, combinations
# source: https://docs.python.org/3/library/itertools.html
def powerset(iterable):
"powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
s = list(iterable)
# use range(1, len(s)+1) to avoid empty result -> comment @mozway
return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
d = [1,2,3]
print(list(powerset(d)))
wich returns 元组作为迭代器(我列出):
[(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
您可以过滤结果以删除空元组并使用
将元组转换为字符串result = [''.join(map(str, tup)) for tup in powerset(d) if tup]
打印(结果)
获得
['1', '2', '3', '12', '13', '23', '123']
- 对于效率不高的解决方案,您可以使用它来筛选出您真正想要的。
您可以使用双循环、切片和字符串连接:
l = [1, 2, 3]
l2 = [str(x) for x in l]
[''.join(l2[i:j+1]) for i in range(len(l2)) for j in range(i, len(l2))]
输出:['1', '12', '123', '2', '23', '3']
嵌套 for 循环怎么样:
sample = [1,':',2022,'.','01','.','01']
sample_str = [str(s) for s in sample]
for ix, i in enumerate(sample_str):
for j in range(ix, len(sample_str)):
print(''.join(sample_str[ix:j+1]))
输出:
1
1:
1:2022
1:2022.
1:2022.01
1:2022.01.
1:2022.01.01
:
:2022
:2022.
:2022.01
:2022.01.
:2022.01.01
2022
2022.
2022.01
2022.01.
2022.01.01
.
.01
.01.
.01.01
01
01.
01.01
.
.01
01