如何在赋值运算符的左侧使用列表理解?

时间:2019-11-14 10:38:35

标签: python list-comprehension

我的代码部分是:

v=[7,0,2,5,1]               # list with any numbers
x={2,0,4}                   # set of indexes (where element of x < len(v) has been provided)
for i in x:                 # this for loop is working
    v[i]-=10
print(v)                    # good result
[-3, 0, -8, 5, -9]

我的问题是如何用列表理解或其他更紧凑的表达式替换上述for循环? 注意:打印内​​容仅显示v的新值 但任务是仅修改原始v列表的某些元素。

5 个答案:

答案 0 :(得分:3)

这并不能完全回答问题,但是除非您正在尝试参加一些代码高尔夫球比赛,否则我希望您能遵循以下内容。这很简单明了-仅因为代码可以放在一行中并不能使其变得更好。

for i in x: 
    v[i] -= 10

答案 1 :(得分:2)

我认为您需要:

v = [i-10 if idx in x else i for idx,i in enumerate(v)])
print(v)

输出:

[-3, 0, -8, 5, -9]

答案 2 :(得分:1)

可能没有太多理由在作业op。的左侧进行列表理解, 此外,修改分配操作。但是尽管如此,我还是想构建这个。 所以问题是我如何通过索引集修改某些元素 在具有列表理解的较长列表中(没有任何列表副本或使用显式cycle语句)。 我只能使用exec()函数通过“自写”代码来实现此解决方案。

首先,我显示一个简单的赋值,具有相同的值

# Let the index set and the "long" list be:
>>> x={0, 2, 4}
>>> v=[0]*10
>>> str(tuple("v["+str(i)+"]" for i in x))+"="+str(len(x)*(1,))
"('v[0]', 'v[2]', 'v[4]')=(1, 1, 1)"
# So I needed to change ("'" to "") at the left side before I could execute it.
>>> str(tuple("v["+str(i)+"]" for i in x)).replace("'","")+"="+str(len(x)*(1,))
'(v[0], v[2], v[4])=(1, 1, 1)'

# Put it into `exec()` function.
>>> exec(str(tuple("v["+str(i)+"]" for i in x)).replace("'","")+"="+str(len(x)*(1,)))
>>> v
[1, 0, 1, 0, 1, 0, 0, 0, 0, 0]

现在,我展示了如何根据x集(这是我的问题)将list元素减少1:

>>> s1=str(tuple("v["+str(i)+"]-=1" for i in x))
>>> s1
"('v[0]-=1', 'v[2]-=1', 'v[4]-=1')"
# Now I used the REG module for more efficient character replacement.
>>> import re as r
>>> r.sub(r"\(|\)|'","",s1).replace(",",";")
v[0]-=1; v[2]-=1; v[4]-=1'

# Now put them together:
>>> exec(r.sub(r"\(|\)|'","",str(tuple("v["+str(i)+"]-=1" for i in  x))).replace(",",";"))
>>> v
[-1, 0, -1, 0, -1, 0, 0, 0, 0, 0]   # if v was 10*[0]

答案 3 :(得分:0)

您可以尝试列表理解:

SELECT A.[AGE],
       A.[SALARY],
       A.[GENDER],
       A.[DATEOBIRTH],
       A.[CITY],
       B.[TEST1],
       C.[TEST2]
FROM [tbl_PR_AGE_VALIDATION_RULE] AS A
LEFT JOIN [tbl_PR_PAGE_VALIDATION_RULE] AS B ON B.ENTITY_ID = A.ENTITY_ID
LEFT JOIN [tbl_PR_CITY_VALIDATION] AS C ON C.ENTITY_ID = B.ENTITY_ID

答案 4 :(得分:0)

我认为以下是您需要的

[v[i]-10 if i in x else v[i] for i in range(len(v))]
[-3, 0, -8, 5, -9]