使用部分匹配的List元素连接List元素

问题描述 投票:0回答:3

假设我有两个python列表:

ListA = ['Jan 2018', 'Feb 2018', 'Mar 2018']
ListB = ['Sales Jan 2018','Units sold Jan 2018','Sales Feb 2018','Units sold Feb 2018','Sales Mar 2018','Units sold Mar 2018']

我需要得到一个输出:

List_op = ['Jan 2018 Sales Jan 2018 Units sold Jan 2018','Feb 2018 Sales Feb 2018 Units sold Feb 2018','Mar 2018 Sales Mar 2018 Units sold Mar 2018']

到目前为止我的方法:

res=set()
for i in ListB:
    for j in ListA:
        if j in i:
            res.add(f'{i} {j}')

print (res)

这给了我结果:

{'Units sold Jan 2018 Jan 2018', 'Sales Feb 2018 Feb 2018', 'Units sold Mar 2018 Mar 2018', 'Units sold Feb 2018 Feb 2018', 'Sales Jan 2018 Jan 2018', 'Sales Mar 2018 Mar 2018'}

这绝对不是我正在寻找的解决方案。

我认为正则表达式在这里可能是少数,但我不确定如何处理。在这方面的任何帮助都非常感谢。

提前致谢。

编辑:

ListA和ListB中的值不一定是有序的。因此,对于ListA中的特定月/年值,必须为“销售”和“销售单位”组件匹配和挑选来自ListB的相同月/年值,并且需要将其连接起来。

我的主要目标是获取我稍后可以使用的列表,以生成我将用于编写Hive查询的语句。

添加了@andrew_reece建议的更多解释

python string list concatenation string-matching
3个回答
1
投票

假设没有需要处理的额外边缘情况,您的原始代码也不错,只需要稍微更新:

List_op = []
for a in ListA:
    combined = a
    for b in ListB:
        if a in b:
            combined += " " + b
    List_op.append(combined)

List_op
['Jan 2018 Sales Jan 2018 Units sold Jan 2018',
 'Feb 2018 Sales Feb 2018 Units sold Feb 2018',
 'Mar 2018 Sales Mar 2018 Units sold Mar 2018']

1
投票

假设ListA和ListB已排序:

ListA = ['Jan 2018', 'Feb 2018', 'Mar 2018']
ListB = ['Sales Jan 2018','Units sold Jan 2018','Sales Feb 2018','Units sold Feb 2018','Sales Mar 2018','Units sold Mar 2018']

print([v1 + " " + v2 for v1, v2 in zip(ListA, [v1 + " " + v2 for v1, v2 in zip(ListB[::2], ListB[1::2])])])

这将打印:

['Jan 2018 Sales Jan 2018 Units sold Jan 2018', 'Feb 2018 Sales Feb 2018 Units sold Feb 2018', 'Mar 2018 Sales Mar 2018 Units sold Mar 2018']

在我的示例中,我首先将List变量连接在一起,然后将ListA与此新列表连接起来。


1
投票

字符串连接可能变得昂贵。在Python 3.6+中,您可以在列表理解中使用更高效的f-strings

res = [f'{i} {j} {k}' for i, j, k in zip(ListA, ListB[::2], ListB[1::2])]

print(res)

['Jan 2018 Sales Jan 2018 Units sold Jan 2018',
 'Feb 2018 Sales Feb 2018 Units sold Feb 2018',
 'Mar 2018 Sales Mar 2018 Units sold Mar 2018']

使用itertools.islice,您可以避免创建新列表的费用:

from itertools import islice

zipper = zip(ListA, islice(ListB, 0, None, 2), islice(ListB, 1, None, 2))
res = [f'{i} {j} {k}' for i, j, k in zipper]
© www.soinside.com 2019 - 2024. All rights reserved.