我的代码部分是:
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列表的某些元素。
答案 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]