Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将ListA元素与部分匹配的ListB元素连接起来_Python_String_List_Concatenation_String Matching - Fatal编程技术网

Python 将ListA元素与部分匹配的ListB元素连接起来

Python 将ListA元素与部分匹配的ListB元素连接起来,python,string,list,concatenation,string-matching,Python,String,List,Concatenation,String Matching,假设我有两个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 sol

假设我有两个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中的相同月/年值,并且需要连接

这里我的主要目标是获取列表,稍后我可以使用该列表生成一条语句,我将使用该语句编写配置单元查询


添加了@andrew_reece建议的更多解释,假设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']

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

假设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']

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

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

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']

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

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']

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

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']
使用,您可以避免创建新列表的费用:

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]

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

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']
使用,您可以避免创建新列表的费用:

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]

您能否更具体地说明您的部分匹配要求?您给出的示例非常简单,可以为其生成一个解决方案,但如果字符串有“Jan-Feb”,或者只有“Feb”,或者只有“2018”,该怎么办?数据中的边缘情况是什么?您希望如何处理它们?考虑提供更健壮的示例数据来说明完整的匹配规则集。(或者,如果您实际上只有这种精确格式的字符串数据,也请说明。)您可以更具体地说明您的部分匹配要求吗?您给出的示例非常简单,可以为其生成一个解决方案,但如果字符串有“Jan-Feb”,或者只有“Feb”,或者只有“2018”,该怎么办?数据中的边缘情况是什么?您希望如何处理它们?考虑提供更健壮的示例数据来说明完整的匹配规则集。(或者,如果您实际上只有这种格式的字符串数据,也请说明。)