列表中的Python 3.8赋值表达式

列表中的Python 3.8赋值表达式,python,python-3.8,python-assignment-expression,Python,Python 3.8,Python 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.

我第一次尝试使用新的,可能需要一些帮助

给定三行日志输出:

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 ..
"""
其目的是提取
州(俄罗斯、印度和美国)和记录计数(93100100)。因此,期望的结果是:

[['Russia',93],['India',100],['US',100]]
这需要将以下步骤转换为Python:

  • 将每行转换为列表元素
  • 按空格拆分,例如,
    ['Writing','93','records','to','/data/newstates-900.03-07_07/top100.newstates-900.03-07_07/rusia.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())]
这里有一个方法:

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]。拆分(“/”[-1]。拆分('.')[0],wrds[1]]用于sin.splitlines()中的行
我发现使用赋值表达式是多余的。您也可以这样做:

[[line.split('/')[-1].split('.')[0],line.split()[1]]用于sin.splitlines()中的行

为了获得更多的价值,您还可以使用regex来获得这一点,这可能会更受欢迎/更高效

[list(reversed(l)) for l in re.findall(r'Writing (\d+).+\/([A-Z,a-z]+)\.', sin)]
或更准确地(转换int)和可读性(根据注释中的要求):


分配不是多余的:您的第二个分配执行了两次
split()
。想象一下如果那是一个昂贵的手术。我获奖是因为这是一个很好的答案。实际上,第二个是一种聪明但也是欺骗:它利用了“/”只存在于最后一个空格分隔的标记中。@javadba我同意你的观点,但我的意思是在这个特定的问题中。另外,如果我的答案是你正在寻找的,你可以检查我答案附近的复选标记。谢谢:)如果你有机会的话:我真的很想看看双嵌套结构。考虑不要使用一个技巧将它分解成一个单一的层次:即OP是一个玩具实例,但是意图是理解如何执行多层次的嵌套(其中多个级别是真正需要的)和赋值表达式.RE:双嵌套结构。你可以等一下:我将创建一个单独的问题,在这个问题中,不可能挤压级别。它将涉及对数字数据的分组和聚合操作。请参见上文:公认的答案将其用于理解。您也可以参考链接的政治公众人物文档。
[[country,int(count)]了解count,country in…]
将更具可读性(并更好地匹配请求的输出)。有用的方法。我确实希望将
walrus
用于许多其他不支持聪明的启发式的数据挖掘任务:但特别是用于测试解析,您的方法非常有意义。@chepner的添加也很有帮助。哦,你刚刚删除了
反向(列表)
。我认为这也有助于提及(不仅仅是完全丢失)我删除了反转,因为它更可读,并且它使将计数转换为int变得更容易,正如我“得到”的那样-但是执行reverse()的技巧实际上是另一个保留在工具箱中的技巧。我已经吸收了,但是未来的读者会看到最终产品,而不是(有趣的)中间解决方案。
[[country, int(count)] for count, country in re.findall(r'Writing (\d+).+\/([A-Z,a-z]+)\.', sin)]