嗨,我正在尝试在一个列表中列出唯一字符串的最大值。你知道吗
示例:
a = ['DS10.json', 'DS11.json', 'DT4.json', 'DT5.json', 'DT6.json', 'CJ6.json', 'CJ7.json']
应向我返回以下列表:
['DS11.json', 'DT6.json', 'CJ7.json']
我尝试了以下代码:
def j(l):
p = []
for i in l:
digcode = i.split('.')[0]
if any(s.startswith(digcode[:2]) for s in p): #there exists prefex in list
if digcode[2:] > p[[n for n, l in enumerate(p) if l.startswith(digcode[:2])][0]][2:]:
p.pop([n for n, l in enumerate(p) if l.startswith(digcode[:2])][0])
p.append(digcode)
else:
pass
else:
p.append(digcode)
return p
但是当我把它应用到一个更大的样本上时,它并不能做一个精确的工作
>>> o = ['AS6.json', 'AS7.json', 'AS8.json', 'AS9.json', 'BS1.json', 'BS2.json', 'BS3.json', 'BS4.json', 'BS5.json', 'CS1.json', 'CS2.json', 'CS3.json', 'CS4.json', 'CS5.json', 'CS6.json', 'DS10.json', 'DS11.json', 'DS4.json', 'DS5.json', 'DS6.json', 'DS7.json', 'DS8.json', 'DS9.json', 'ES4.json', 'ES5.json', 'ES6.json', 'FS5.json', 'FS6.json', 'FS7.json', 'FS8.json', 'MS4.json', 'MS5.json', 'MS6.json', 'MS7.json', 'MS8.json', 'MS9.json', 'NR1.json', 'NR2.json', 'NR3.json', 'NR4.json', 'NR5.json', 'NR6.json', 'NR7.json', 'NR8.json', 'VR1.json', 'VR2.json', 'VR3.json', 'VR4.json', 'VR5.json', 'VR6.json', 'VR7.json', 'VR8.json', 'XS11.json', 'XS9.json']
>>> j(o)
['AS9', 'BS5', 'CS6', 'DS9', 'ES6', 'FS8', 'MS9', 'NR8', 'VR8', 'XS9']
这是不正确的,因为有一个XS11和DS11的例子。你知道吗
如果有人能帮我纠正我的问题,或者能为我的问题找到一个更简单的解决办法,我将不胜感激。谢谢
您正在进行string比较;
'9'
大于'11'
,因为字符'9'
在字母表中位于后面。你得先把它们转换成整数。你知道吗我会使用字典将前缀映射到最大值:
这样做效率更高,因为它不会每次都在整个输入列表上循环;处理列表N^2次(添加一个元素,然后添加N个测试来完成);而是以N个步骤来处理列表。因此,它不是对10个元素执行100个测试,而是只执行10个测试。你知道吗
演示:
看起来您的
digcode[2:]
值是按字典顺序进行比较的,而不是按数字顺序进行比较的。你知道吗因此
9
被认为是“大于”11
,因为在单词列表中,以“9”开头的单词会在以“11”开头的单词后面。你知道吗为了便于比较,您应该将
digcode[2:]
转换为数字,即int(digcode[2:])
至
这将提供:
相关问题 更多 >
编程相关推荐