如何在 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