这是一个相对简单的问题,要从嵌套列表中列出具有最大值的元素。
所以我做了这个功能,
attribute
在这样做的时候,我被困在第二步,从那时起我就一直呆在那里。
以下是功能:
def secondMax(data):
x = max(data, key=lambda x:x[1])
for i in range(0, len(data)):
if(data[i][1] == x[1]):
data[i][1] = 0
print(x) # prints ['yash',0]
print(x) # prints ['yash',0]
return data当我运行代码时,这是输出
运行
# data being fed
data = [['yash', 5.0], ['akash', 5.0], ['harsh', 3.0], ['dj', 4.0], ['ashutosh', 4.0]]
secondMax(data)输出
# output
['yash', 0]
['yash', 0]
[['yash', 0], ['akash', 5.0], ['harsh', 3.0], ['dj', 4.0], ['ashutosh', 4.0]]现在,为什么没有将第二个元素(akash,5.0)设置为(akash,0)?据我所知,x的值不应该改变(它正在改变)并导致这一点。
为什么会发生这种情况?
发布于 2019-11-26 09:41:16
看起来像
x = max(data, key=lambda x:x[1])返回对最大元素的引用。因此,当您在第一次迭代期间将其值设置为零时
if(data[i][1] == x[1]):
data[i][1] = 0实际上,您正在更改用于比较的值。从现在起,x1将为零。因此,基本上'akash'不匹配,因为您正在将其值5.0与0.0进行比较,后者显然返回False。
发布于 2019-11-26 09:17:51
下面的代码中的max_user引用同一个对象,即data中的nested list。当我们更改嵌套列表的内部值时,它也会反映在我们的max_user中(因为它引用的是同一个对象,而不是内部值)。
因此,我采用了一个.copy() of max_user,并使用它进行比较。
稍加修改,您就可以在循环中遍历列表并访问它,而不需要使用range,
>>> def secondMax(data):
max_user = max(data, key=lambda x:x[1])
_temp = max_user.copy()
for user in data:
if user[1] == _temp[1]:
user[1] = 0
print(_temp)
print(_temp)
return data输出:
>>> secondMax(data)
['yash', 5.0]
['yash', 5.0]
['yash', 5.0]
[['yash', 0], ['akash', 0], ['harsh', 3.0], ['dj', 4.0], ['ashutosh', 4.0]]https://stackoverflow.com/questions/59047333
复制相似问题