Python 3.8 列表理解中的赋值表达式

标签 python python-3.8 python-assignment-expression

我正在尝试使用新的 assignment expression第一次,需要一些帮助。

给定三行日志输出:

sin = """Writing 93 records to /data/newstates-900.03-07_07/top100.newstates-900.03-07_07/Russia.seirdc.March6-900.12.csv ..
Writing 100 records to /data/newstates-900.03-07_07/top100.newstates-900.03-07_07/India.seirdc.March6-900.6.csv ..
Writing 100 records to /data/newstates-900.03-07_07/top100.newstates-900.03-07_07/US.seirdc.March6-900.15.csv ..
"""

目的是仅提取国家(俄罗斯印度美国)和记录数(93,100,100)。所以想要的结果是:

[['Russia',93],['India',100],['US',100]]

这需要将以下步骤转换为 Python:

  • 将每一行转换为列表元素
  • 按空格分割,例如['写作', '93', '记录', '至', '/data/newstates-900.03-07_07/top100.newstates-900.03-07_07/Russia.seirdc.March6-900.12.csv', ' ..']
  • 用“/”分割第五个这样的标记并保留最后一个元素:例如Russia.seirdc.March6-900.12.csv
  • 用“.”拆分该元素并保留第一个(第 0 个)元素,例如俄罗斯

这是我的错误尝试:

import fileinput
y = [[ z[4].split('/')[-1].split('.')[0],z[1]] 
     for (z:=x.split(' ')) in 
     (x:=sin if sin else fileinput.input()).splitlines())]

最佳答案

对于它的值(value),您也可以使用正则表达式来获得它,这可能会更优选/更高效。

[list(reversed(l)) for l in re.findall(r'Writing (\d+).+\/([A-Z,a-z]+)\.', sin)]

或更准确地说(转换 int) 和可读性(根据评论中的 @chepner):

[[country, int(count)] for count, country in re.findall(r'Writing (\d+).+\/([A-Z,a-z]+)\.', sin)]

关于Python 3.8 列表理解中的赋值表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60606058/

相关文章:

python - 旧的 python 散列从左到右完成——为什么不好?

python - Plotly:如何在 plotly express 折线图中更改图例的变量/标签名称?

python - 输入文件的字符串转换

opencv - 为什么 OpenCV 与 sublime text 3 和 python 3.8 意外退出?

python - 如何更改 Raspberry Pi 中的默认 Python 版本

python - "walrus operator"赋值的多个条件

python - 尝试使用 urllib2 将 json 数据发送到 toggl api 时出现 HTTP 错误 400

macos - resizeable() 为什么或如何解决我的 "two tk"问题

python - 使用 Python 3.8 中的赋值表达式,为什么我们需要在 `as` 中使用 `with` ?

python - 是否可以添加带有列表理解的 where 子句?