这是一个相对简单的问题,要从嵌套列表中列出具有最大值的元素。
所以我做了这个功能,
这样做的时候,我陷入了第2步,从那以后就一直在那里。
这是功能:
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
的值不应更改(正在更改)并引起这种情况。
为什么会这样?
答案 0 :(得分:1)
看起来像
x = max(data, key=lambda x:x[1])
返回对最大元素的引用。因此,当您在第一次迭代中将其值设置为零时
if(data[i][1] == x[1]):
data[i][1] = 0
您实际上正在更改用于比较的值。从现在开始,x [1]将为零。因此基本上'akash'
不匹配,因为您正在将其值5.0与0.0进行比较,后者显然会返回False
。
答案 1 :(得分:0)
以下代码中的max_user
引用了同一对象,即nested list
中的data
。当我们更改嵌套列表的内部值时,它也将反映在我们的max_user
中(因为它引用的是同一对象,而不是内部值)。
因此,我选取了{_1}个max_user并将其用于比较。
进行了一些小的更正,您可以遍历列表并循环访问它,而无需使用.copy()
,
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