3

我第一次尝试使用新的赋值表达式并且可以使用一些帮助。

给定三行日志输出:

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 ..
"""

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

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

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

  • 将每一行转换为列表元素
  • 按空间分割,例如 ['Writing', '93', 'records', 'to', '/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'th)元素,例如Russia

这是我的错误尝试:

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

3 回答 3

3

对于它的价值,你也可以使用正则表达式来获得它,这可能会更优选/更有效。

[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)]
于 2020-03-09T18:22:42.243 回答
2

这够好吗?

[[(wrds := line.split())[4].split("/")[-1].split('.')[0], wrds[1]] for line in sin.splitlines()]

我发现使用赋值表达式是多余的。你也可以这样做:

[[line.split('/')[-1].split('.')[0], line.split()[1]] for line in sin.splitlines()]
于 2020-03-09T18:12:14.813 回答
0

这是一种方法:

results = []
for line in sin.split('..'):
    if len(z := line.split(' ')) > 1 :
        results.append([line.split('/')[-1].split('.')[0], z[1]])
于 2020-03-09T18:11:21.497 回答