具有正确格式列表的SyntaxError

2024-06-28 20:22:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个集合,如果另一个集合中有匹配项,我想更新它。否则,如果没有匹配项,我想将错误消息字符串附加到列表中。我引用了if/else in a list comprehension来编写代码

以下是我写的:

logstocrunch_set=dirlogs_set.difference(dblogs_set)
pattern = re.compile(r"\d*F[IR]P",re.IGNORECASE)  #to find register values
logstocrunch_finset = set()
errorlist = []
logstocrunch_finset.update([x for x if pattern.search(x) else errorlist.append(f'{x} is not proper name') for x in logstocrunch_set])

然而,当我运行这个程序时,我得到了错误无效语法,arror指向我的if语句

那么为什么会发生这种情况呢


Tags: 字符串inre消息列表forif错误
2条回答

列表理解是创建单个列表的一种方法。基本条件表必须采用以下格式:

[ expression for item in iterable if condition ]

你不能(轻松地)用一种理解更新两个对象。另外,声明logstocrunch_finset和errorlist然后填充它们也没有多大意义。相反,像这样的事情怎么样:

pattern = re.compile(r"\d*F[IR]P", re.IGNORECASE)
logstocrunch_finset = {x for x in logstocrunch_set if pattern.search(x)}
errorlist = [f'{x} is not proper name' for x in logstocrunch_set.difference(logstocrunch_finset)]

以下更新-与for循环的性能比较

正如@Barmar所建议的,我对我们的两个解决方案进行了基准测试。里面没什么。这两种理解似乎能更好地处理更大的输入集。更改有效数据与无效数据的比率似乎没有多大区别

import re

range_limit = 10
logstocrunch_set = set(
    [f'{i}FRP' for i in range(range_limit)] + 
    [f'longer_{i}frp_lower' for i in range(range_limit)] + 
    ['not valid', 'something else']
)
pattern = re.compile(r"\d*F[IR]P",re.IGNORECASE)
%%timeit -n 100000 -r 20

logstocrunch_finset = set()
errorlist = []
for x in logstocrunch_set:
    if pattern.search(x):
        logstocrunch_finset.add(x)
    else:
        errorlist.append(f'{x} is not proper name')
  • 范围限制=每个回路10 | 9.53µs±34.2 ns(20次运行的平均值±标准偏差,每个回路100000次)
  • 范围|限值=50 | 45.5µs±699 ns/回路(20次运行的平均值±标准偏差,每个100000回路)
  • 范围限制=每个回路100 | 89.4µs±1.2µs(10次运行的平均值±标准偏差,每个100000个回路)
%%timeit -n 100000 -r 20

logstocrunch_finset = {x for x in logstocrunch_set if pattern.search(x)}
errorlist = [f'{x} is not proper name' for x in logstocrunch_set.difference(logstocrunch_finset)]
  • 范围|限值=每个回路10 | 9.58µs±14.1 ns(20次运行的平均值±标准偏差,每个回路100000次)
  • 范围限制=每个回路50 | 42.2µs±24.7 ns(20次运行的平均值±标准偏差,每个回路100000次)
  • 范围限制=每个回路100 | 82.2µs±491 ns(10次运行的平均值±标准偏差,每个回路100000次)

带条件的列表理解的语法为:

[<value> for <variable> in <iterable> if <condition>]

if <condition>在iterable后面,而不是前面

此外,这里不能有else子句。它不是返回不同值的条件表达式,它只是用来过滤迭代器中的值,所以else没有意义

您似乎将其与<value>部分中的条件表达式相混淆,它允许您根据条件指定要在结果列表中返回的不同值。这只是一个普通的条件表达式,不特定于列表理解

如果要更新多个目标,则不应使用列表理解。使用普通循环

logstocrunch_finset = set()
errorlist = []
for x in logstocrunch_set:
    if pattern.search(x):
        logtocrunch_finset.add(x)
    else:
        errorlist.append(f'{x} is not proper name')

相关问题 更多 >