Python调用list.remove(x)提示元素存在但找不到的报错排查
报错根因
best_option函数返回值为长度为1的列表(例如你给出的测试场景中返回的是['22']),而非字符串元素。你将该列表作为参数传入a.remove()时,原列表a中存储的都是字符串类型的元素,无法匹配到列表类型的参数,直接抛出ValueError。- 后续逻辑中
res为字符串类型,调用res.append(a)会触发属性错误,字符串无append方法。 - 你当前的字符串优先级对比逻辑存在缺陷,逐位截取对比的方式在处理长度不一的字符串时容易出现判断错误,正确的对比逻辑应为直接判断两个字符串拼接后的结果大小:若
x+y > y+x则x应该排在y前面。
修正后可运行代码
最优实现方案(逻辑无缺陷)
import sys from functools import cmp_to_key def compare(x, y): if x + y > y + x: return -1 elif x + y < y + x: return 1 else: return 0 def largest_number(a): a.sort(key=cmp_to_key(compare)) res = ''.join(a) # 处理全0的特殊场景 return '0' if res[0] == '0' else res if __name__ == '__main__': input = sys.stdin.read() data = input.split() a = data[1:] print(largest_number(a))
基于原有代码最小修改(仅解决报错,逻辑缺陷仍存在)
import sys def best_option(a): iterator = 0 while(len(a)>1): previous_best_digit = 0 current_best_digit = 0 best_short_option = [] return_list = [] for item in a: if len(item)-1 < iterator: char_previous = item[iterator-1:iterator] dig_previous = ord(char_previous) previous_best_digit = dig_previous best_short_option = item continue char = item[iterator:iterator+1] dig = ord(char) if dig > current_best_digit: current_best_digit = dig return_list.clear() return_list.append(item) elif dig == current_best_digit: return_list.append(item) if (current_best_digit < previous_best_digit): return_list.clear() return_list.append(best_short_option) a = return_list iterator+=1 # 修正返回值为字符串元素,而非列表 return a[0] def largest_number(a): res = "" while (True): best_choice = best_option(a) print(best_choice) a.remove(best_choice) res += best_choice if (len(a)==1): break # 修正字符串拼接逻辑,删除append调用 res += a[0] print(res) return res if __name__ == '__main__': input = sys.stdin.read() data = input.split() a = data[1:] print(largest_number(a))
内容的提问来源于stack exchange,提问作者brerlapine
相关产品推荐
相关产品推荐

