是多级列表理解中必需的中间列表

Mic*_*eyn 3 python python-3.x python-3.6

这是一个具体的例子:

my_dict={k:int(encoded_value) 
         for (k,encoded_value) in 
             [encoded_key_value.split('=') for encoded_key_value in 
              many_encoded_key_values.split(',')]}
Run Code Online (Sandbox Code Playgroud)

问题是关于内部列表[],是否可以避免,例如:

# This will not parse
my_dict={k:int(encoded_value) 
         for (k,encoded_value) in 
             encoded_key_value.split('=') for encoded_key_value in 
             many_encoded_key_values.split(',')}
Run Code Online (Sandbox Code Playgroud)

...,这是无效的语法:

NameError: name 'encoded_key_value' is not defined

样本数据: aa=1,bb=2,cc=3,dd=4,ee=-5

Rom*_*est 5

如前所述,生成器表达式将增强您的方法,避免创建内部列表.但是使用re.findall()函数有一个更短的方法来获得所需的结果:

result = {k:int(v) for k,v in re.findall(r'(\w+)=([^,]+)', many_encoded_key_values)}
print(result)
Run Code Online (Sandbox Code Playgroud)

输出:

{'dd': 4, 'aa': 1, 'bb': 2, 'ee': -5, 'cc': 3}
Run Code Online (Sandbox Code Playgroud)

替代方法是使用re.finditer()返回'callable_iterator'实例的函数:

result = {m.group(1):int(m.group(2)) for m in re.finditer(r'(\w+)=([^,]+)', many_encoded_key_values)}
Run Code Online (Sandbox Code Playgroud)

  • `findall()`**确实**构建了一个`list`. (2认同)