【问题标题】:python change for_loop in list comprehesionpython在列表理解中更改for循环
【发布时间】:2021-11-09 15:51:17
【问题描述】:

我得到的代码如下:

ix=0
list_test=[]
for el in parse_data_2['var_nm_final']:    
    if el=='URI':
        ix+=1
        list_test.append(ix)
    else:
        list_test.append(None)

parse_data_2 是我的 DF。作为输出,我想根据我的情况接收递增值为 ix 或 None 的列表。意思是这样的

1
None
None
None
None
2
None
3
None
None
None
None
4

...等等

我尝试将此循环转换为这样的列表理解:

[ix+=1 if el=='URI'else None for el in parse_data_2['var_nm_final']]         

但出现错误

[ix+=1 if el=='URI'else None for el in parse_data_2['var_nm_final']]
       ^
SyntaxError: invalid syntax

您能解释一下我的代码的问题吗?

【问题讨论】:

  • 在这种情况下,我个人会使用显式循环。它的作用很清楚,它非常易于阅读,并且可以满足您的需求。

标签: python list-comprehension


【解决方案1】:

itertools.count 上使用next(或者只是range 具有较大的上限):

>>> parse_data_2 = {'var_nm_final': ["URI", "foo", "bar", "URI", "URI", "blub", "URI"]}
>>> import itertools
>>> cnt = itertools.count(1)
>>> [next(cnt) if el == "URI" else None for el in parse_data_2["var_nm_final"]]
[1, None, None, 2, 3, None, 4]

【讨论】:

  • 太棒了,不知道。谢谢
【解决方案2】:

这是the walrus operator 的一个很好的用例! 但是请不要这样做。无论您想要完成什么,几乎可以肯定地以 Python 的 高性能方式完成。

[(ix:=ix+1) if el=='URI'else None for el in parse_data_2['var_nm_final']]   

【讨论】:

  • 好吧..这是一个用例,我同意 ;)
  • 请不要写这样的代码...
  • @MarcoBonelli 我听到了,这是糟糕的代码。也就是说,它可以满足 OP 的要求......
  • 这段代码有什么缺点?
  • @data_b77 无论你想用你的el 变量做什么,都可以通过parse_data_2['var_nm_final'].eq('URI').sum() 或类似的东西来完成——生成一个列表理解对你的元素生成器的形式很差,也可能不是最高效的解决方案。
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多