【问题标题】:Loop in a list of tuples joining elements of each tuple在连接每个元组的元素的元组列表中循环
【发布时间】:2020-08-08 02:03:10
【问题描述】:

我一直在尝试使此代码更好/更快且更可持续,但尚未成功对其进行改进。

基本上,我需要循环进入一个元组列表,并将元组的每个元素与数据帧过滤器表达式连接起来,就像解决方案中显示的那样。然而,我列表中的元组长度不同,它们可以不时改变并具有不同的长度,有时我可以得到每个元素少于 4 个的元组,其他时候超过 6 个甚至 7/8 等等在。

我的解决方案有效,但每次元组长度增加时我都需要进行编辑,而且我知道这不是最有效的解决方案。为了避免嵌套 if,我将如何使用每个元组的长度在元组内部进行迭代?

感谢您的建议和cmets

实际列表:

 Comb = [(),
 ('RD00',),
 ('RDC2',),
 ('RDC3',),
 ('RDC4',),
 ('RD00', 'RDC2'),
 ('RD00', 'RDC3'),
 ('RD00', 'RDC4'),
 ('RDC2', 'RDC3'),
 ('RDC2', 'RDC4'),
 ('RDC3', 'RDC4'),
 ('RD00', 'RDC2', 'RDC3'),
 ('RD00', 'RDC2', 'RDC4'),
 ('RD00', 'RDC3', 'RDC4'),
 ('RDC2', 'RDC3', 'RDC4'),
 ('RD00', 'RDC2', 'RDC3', 'RDC4')]

我想出了这个解决方案,我需要将每个元组中的元组元素连接起来,并在元组中的每个元素前面添加表达式:

 for p in comb:
    if len(p) == 1:
        print(''"(fF2_Principal['Messagetype']=="'{}'.format("'"+p[0]+"')"))
    if len(p) == 2:
        print(''"(fF2_Principal['Messagetype']=="'{} & '"   (fF2_Principal['Messagetype']=="'{}'.format("'"+p[0]+"')", "'"+p[1]+"')"))
    elif len(p) == 3:
        print(''"(fF2_Principal['Messagetype']=="'{} & '"(fF2_Principal['Messagetype']=="'{} & '"(fF2_Principal['Messagetype']=="'{}'.format("'"+p[0]+"')", "'"+p[1]+"')","'"+p[2]+"')"))
    elif len(p) == 4:
        print(''"(fF2_Principal['Messagetype']=="'{} & '"(fF2_Principal['Messagetype']=="'{} & '" (fF2_Principal['Messagetype']=="'{} & '"(fF2_Principal['Messagetype']=="'{}'.format("'"+p[0]+"')", "'"+p[1]+"')","'"+p[2]+"')","'"+p[3]+"')"))
    elif len(p) == 5: # not done yet, my previous data had 5 elements in one tuple
        print('{} : {} : {} : {} : {}'.format(p[0], p[1],p[2],p[3],p[4])) 

上面的代码生成以下结果,这适用于我的目的,但是我无法监控数据以查看何时会出现不同长度的元组。
结果

    (fF2_Principal['Messagetype']=='RD00')
    (fF2_Principal['Messagetype']=='RDC2')
    (fF2_Principal['Messagetype']=='RDC3')
    (fF2_Principal['Messagetype']=='RDC4')
    (fF2_Principal['Messagetype']=='RD00') & (fF2_Principal['Messagetype']=='RDC2')
    (fF2_Principal['Messagetype']=='RD00') & (fF2_Principal['Messagetype']=='RDC3')
    (fF2_Principal['Messagetype']=='RD00') & (fF2_Principal['Messagetype']=='RDC4')
    (fF2_Principal['Messagetype']=='RDC2') & (fF2_Principal['Messagetype']=='RDC3')
    (fF2_Principal['Messagetype']=='RDC2') & (fF2_Principal['Messagetype']=='RDC4')
    (fF2_Principal['Messagetype']=='RDC3') & (fF2_Principal['Messagetype']=='RDC4')
    (fF2_Principal['Messagetype']=='RD00') & (fF2_Principal['Messagetype']=='RDC2') & 
    (fF2_Principal['Messagetype']=='RDC3')
    (fF2_Principal['Messagetype']=='RD00') & (fF2_Principal['Messagetype']=='RDC2') & 
    (fF2_Principal['Messagetype']=='RDC4')
    (fF2_Principal['Messagetype']=='RD00') & (fF2_Principal['Messagetype']=='RDC3') & 
    (fF2_Principal['Messagetype']=='RDC4')
    (fF2_Principal['Messagetype']=='RDC2') & (fF2_Principal['Messagetype']=='RDC3') & 
    (fF2_Principal['Messagetype']=='RDC4')
    (fF2_Principal['Messagetype']=='RD00') & (fF2_Principal['Messagetype']=='RDC2') & 
    (fF2_Principal['Messagetype']=='RDC3') & (fF2_Principal['Messagetype']=='RDC4')

非常感谢您的 cmets 并就如何改进此代码并使其更具可持续性提出建议。

【问题讨论】:

    标签: python-3.x tuples


    【解决方案1】:

    最简单的方法是使用列表推导(单独写入元组文本中的每个条目)以及str.join() 将任意数量的它们拼凑在一起。

    >>> for tup in Comb:
    ...     msg = " & ".join(
    ...         f"(fF2_Principal['Messagetype']=='{e}')" for e in tup
    ...     )
    ...     print(msg)
    ...
    
    (fF2_Principal['Messagetype']=='RD00')
    (fF2_Principal['Messagetype']=='RDC2')
    (fF2_Principal['Messagetype']=='RDC3')
    (fF2_Principal['Messagetype']=='RDC4')
    (fF2_Principal['Messagetype']=='RD00') & (fF2_Principal['Messagetype']=='RDC2')
    (fF2_Principal['Messagetype']=='RD00') & (fF2_Principal['Messagetype']=='RDC3')
    (fF2_Principal['Messagetype']=='RD00') & (fF2_Principal['Messagetype']=='RDC4')
    (fF2_Principal['Messagetype']=='RDC2') & (fF2_Principal['Messagetype']=='RDC3')
    (fF2_Principal['Messagetype']=='RDC2') & (fF2_Principal['Messagetype']=='RDC4')
    (fF2_Principal['Messagetype']=='RDC3') & (fF2_Principal['Messagetype']=='RDC4')
    (fF2_Principal['Messagetype']=='RD00') & (fF2_Principal['Messagetype']=='RDC2') & (fF2_Principal['Messagetype']=='RDC3')
    (fF2_Principal['Messagetype']=='RD00') & (fF2_Principal['Messagetype']=='RDC2') & (fF2_Principal['Messagetype']=='RDC4')
    (fF2_Principal['Messagetype']=='RD00') & (fF2_Principal['Messagetype']=='RDC3') & (fF2_Principal['Messagetype']=='RDC4')
    (fF2_Principal['Messagetype']=='RDC2') & (fF2_Principal['Messagetype']=='RDC3') & (fF2_Principal['Messagetype']=='RDC4')
    (fF2_Principal['Messagetype']=='RD00') & (fF2_Principal['Messagetype']=='RDC2') & (fF2_Principal['Messagetype']=='RDC3') & (fF2_Principal['Messagetype']=='RDC4')
    

    您会注意到,这会为第一个元素生成一个空行。如果您不想打印任何内容,甚至是空行,那么您可以将if len(e) > 0 添加到推导式的末尾,紧跟在for e in tup 之后,如果元组包含0 个元素,它将过滤掉它们。

    【讨论】:

      猜你喜欢
      • 2014-01-11
      • 2023-03-21
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-19
      • 2023-04-03
      • 1970-01-01
      相关资源
      最近更新 更多