Python 3.8 列表理解中的赋值表达式
Python 3.8 assignment expression in a list comprehension
我是第一次尝试使用新的 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 ..
"""
目的是仅提取 State
(俄罗斯、印度 和 美国) 和记录数 (93,100,100) 。所以期望的结果是:
[['Russia',93],['India',100],['US',100]]
这需要经过以下步骤才能翻译成Python:
- 将每一行转换成一个列表元素
- 被 space 拆分,例如
['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 个)元素,例如
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())]
这是一种方法:
results = []
for line in sin.split('..'):
if len(z := line.split(' ')) > 1 :
results.append([line.split('/')[-1].split('.')[0], z[1]])
这样够好吗?
[[(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()]
对于它的价值,你也可以使用正则表达式来获得它,这可能会更多 preferred/efficient。
[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)]
我是第一次尝试使用新的 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 ..
"""
目的是仅提取 State
(俄罗斯、印度 和 美国) 和记录数 (93,100,100) 。所以期望的结果是:
[['Russia',93],['India',100],['US',100]]
这需要经过以下步骤才能翻译成Python:
- 将每一行转换成一个列表元素
- 被 space 拆分,例如
['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 个)元素,例如
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())]
这是一种方法:
results = []
for line in sin.split('..'):
if len(z := line.split(' ')) > 1 :
results.append([line.split('/')[-1].split('.')[0], z[1]])
这样够好吗?
[[(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()]
对于它的价值,你也可以使用正则表达式来获得它,这可能会更多 preferred/efficient。
[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)]