【问题标题】:Concatenate ListA elements with partially matching ListB elements用部分匹配的 List 元素连接 List 元素
【发布时间】:2018-07-28 13:47:10
【问题描述】:

假设我有两个 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 的“Sales”和“Units sold”组件匹配和选择相同的月/年值,并且需要连接起来。

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

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

【问题讨论】:

  • 您能否更具体地说明您的部分匹配要求?您给出的示例很容易为其生成解决方案,但是,例如,具有“Jan Feb”、“Feb”或“2018”的字符串呢?您的数据中有哪些边缘情况,您希望如何处理它们?考虑提供更强大的示例数据来说明完整的匹配规则集。 (或者,如果您实际上只有这种格式的字符串数据,也请说明。)

标签: python string list concatenation string-matching


【解决方案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']

【讨论】:

    【解决方案2】:

    假设 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 与这个新列表连接起来。

    【讨论】:

      【解决方案3】:

      字符串连接可能会变得很昂贵。在 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]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-18
        • 2020-02-04
        • 2019-10-25
        相关资源
        最近更新 更多