lis[j]=words.pop()[i]
IndexError: string index out of range
我需要对列表进行排序,但以x开头的单词应该是第一个。
代码是
def front_x(words):
i=0
lis=[]
j=0
k=0
words.sort()
while i<len(words):
if words[i][0:1]=="x":
lis[j]=words.pop()[i]
j+=1
i+=1
lis.extend(words)
while k<len(lis):
print(lis[k])
k+=1
return
答案 0 :(得分:5)
lis
是一个空列表,任何索引都会引发异常。
如果您想向该列表添加元素,请改用lis.append()
。
请注意,您可以直接遍历序列 ,无需保留自己的计数器:
def front_x(words):
lis = []
words.sort()
for word in words:
if word.startswith("x"):
lis.append(word)
for entry in lis:
print(entry)
您可以通过立即打印以x
开头的所有单词来进一步减少这一点,而无需构建单独的列表:
def front_x(words):
for word in sorted(words):
if word.startswith("x"):
print(word)
如果您希望对列表中的所有x
字词进行排序,请使用自定义排序键:
def front_x(words):
return sorted(words, key=lambda w: (not w.startswith('x'), w))
首先按.startswith('x')
的布尔标志对单词进行排序; False
在True
之前排序,因此我们否定该测试,然后是单词本身。
演示:
>>> words = ['foo', 'bar', 'xbaz', 'eggs', 'xspam', 'xham']
>>> sorted(words, key=lambda w: (not w.startswith('x'), w))
['xbaz', 'xham', 'xspam', 'bar', 'eggs', 'foo']
答案 1 :(得分:0)
我需要对列表进行排序,但以x开头的单词应该是第一个。
在@ Martijn的扩展答案中对自定义搜索键的补充,您也可以尝试这一点,这更接近您原来的方法,可能更容易理解:
def front_x(words):
has_x, hasnt = [], []
for word in sorted(words):
if word.startswith('x'):
has_x.append(word)
else:
hasnt.append(word)
return has_x + hasnt
关于您原始代码的错误,该行实际上存在三个问题
lis[j]=words.pop()[i]
lis[j]
仅在列表已有j
元素时才有效,但在您将项目添加到最初为空的列表时,应使用lis.append(...)
代替。i
处以“x”开头的字词,但pop()
将始终删除 last 项目。 pop()
用于堆栈;在使用索引循环时,永远不要从列表中删除项目![i]
运算符,即您正在访问单词<{1}} 字母< / em>,可能会短得多;因此i