我该怎么做任务列表中的理解?我该怎么做任务列表中的理解?(How can I do assignme

2019-05-13 15:17发布

我想使用赋值运算符列表中的理解。 我怎样才能做到这一点?

下面的代码是无效的语法。 我的意思是设定lst[0]为空字符串''如果它匹配pattern

[ lst[0] = '' for pattern in start_pattern if lst[0] == pattern ]

谢谢!

Answer 1:

看起来你是在混淆列表理解与循环结构在Python。

列表理解产生 - 一个列表! 它本身不适合于单个分配在现有列表。 (虽然你会折磨人的语法来做到这一点...)

虽然它是不完全清楚你正在尝试从您的代码做的,我觉得它更类似于遍历列表(流量控制)VS产生列表(list解析)

遍历列表如下:

for pattern in patterns:
   if lst[0] == pattern: lst[0]=''

也就是说要做到这一点合理的方式,是你会在C,帕斯卡尔等,做什么,但你也可以只是测试列表中为一个值,并将其更改:

if lst[0] in patterns: lst[0] = ''

或者,如果你不知道该索引:

i=lst.index[pattern]
lst[i]=''

或者,如果你有一个列表的列表,并希望改变每个子列表的每个第一个元素:

for i, sublst in enumerate(lst):
    if sublst[i][0] in patterns: sublist[i][0]=''

等,等,等。

如果你想要的东西应用到列表中的每一个元素,那么你可以看看使用列表中理解,或地图,或在Python套件中的其它许多工具之一。

就个人而言,我通常倾向于使用列表理解更多列表创建:

 l=[[ x for x in range(5) ] for y in range(4)]  #init a list of lists...

这比更自然:

l=[]
for i in range(4):
   l.append([])
   for j in range(5):
      l[i].append(j)      

但修改列表是相同的列表,这是更容易理解?

这个:

l=[['new value' if j==0 else l[i][j] for j in range(len(l[i]))] for i in range(len(l))]

或这个:

for i,outter in enumerate(l):
    l[i][0]='new value'               

因人而异

这里是一个很好的教程。



Answer 2:

Python语言对表达式和语句不同的概念。

赋值是一个语句即使有时语法技巧,你以为它是一个表达式(如a=b=99的作品不过是一个特殊的语法的情况下,并不意味着b=99是一个表达式像它例如用C )。

List内涵是不是表达式,因为它们返回一个值,在一定意义上他们执行的循环是一个事件,主要的一点是返回的列表。

声明可以包含表达式,但表达式不能包含语句。

这就是说然而列表项分配新建分配FY到在内部转换为一个方法调用(允许列表状物体的创建)和方法调用都是表达式。 因此,您可以在技术上使用列表项任务中的表达式:

[ lst.__setitem__(0, '') for pattern in start_pattern if lst[0] == pattern ]

但是,这是认为是不好的,因为它损害了可读性,是多么容易阅读源代码是用Python语言的主要焦点 。 而应该写例如...

for pattern in start_pattern:
    if lst[0] == pattern:
        lst[0] = ''

该感谢的方式,通过in运营商就相当于更可读

if lst[0] in start_pattern:
    lst[0] = ''

列表解析用于它们的返回值和他们做一个循环内部...如果你想要的是循环然后只写一个循环......谁就将阅读代码试图了解它确实应该理解,很多(和谁包括自己在几个星期)。



Answer 3:

简而言之:你不知道。 List内涵是生成列表,而不是修改现有的名单。 如果要修改的列表,使用for循环,因为这是他们的东西。

编写代码的Python的方式会是这样的:

for pattern in start_pattern:
    if lst[0] == pattern:
        lst[0] = ''
        #the following assumes that pattern will never be ''
        #if that's possible, you can ignore this bit
        break

但是,如果你真的想要做的作业里面一个,并且不介意谁以往任何时候都与您的代码恨它为所有永恒涉及每一个Python程序员,也有可以使用的一些功能:

  • 如果你想赋给变量是一个全球性的,那么你可以做

      globals().update(var=value) 
  • 如果你想赋给变量是一个可变的序列或地图(如列表或字典)

      list.__setitem__(index, value) 


Answer 4:

Python的3.8将引入赋值表达式

这是一个新的符号: :=允许分配的内涵(其他事情中)。

它会引入大量的潜在节省WRT计算/存储的,如可以从上述链接PEP的下面的代码段中可以看出(格式化适于SO):

语法和语义

在任意的Python表达式可用于大多数情况下,一个命名表达式可以出现。 这是形式的NAME := expr其中expr是其他比加括号的元组的任何有效的Python表达式,和NAME是一个标识符。

这样的命名表达式的值是一样的方式并入表达,与目标被分配该值的附加的副作用:

  1. 处理正则表达式匹配

     if (match := pattern.search(data)) is not None: # Do something with match 
  2. 一个循环,不能使用2- ARG ITER而轻易地改写()

     while chunk := file.read(8192): process(chunk) 
  3. 重用值是昂贵的计算

     [y := f(x), y**2, y**3] 
  4. 分享一个修真筛选子句和输出之间的子表达式

     filtered_data = [y for x in data if (y := f(x)) is not None] 

这是已经可以在最近发布alpha版本(不建议在生产系统!)。 你可以找到发布计划为Python 3.8在这里 。



Answer 5:

如果你在这个问题换货是:

[ lst[0] = '' for lst in listOfLists if lst[0] == pattern ]

或模式列表

[ lst[0] = '' for lst in listOfLists if lst[0] in patterns ]

这实际上可以很容易地实现

[ [''] + lst[1:] for lst in listOfLists if lst[0] == pattern ]

或模式列表再次

[[''] + lst[1:] for lst in listOfLists if lst[0] in patterns ]


文章来源: How can I do assignments in a list comprehension?