为什么这个不正确?(codeeval挑战)PYTHON
这是我需要做的事情:https://www.codeeval.com/open_challenges/140/
我已经在这个挑战上花了三天时间了,请帮帮我。现在的进度是85-90%解决了,但还没有100%解决... 为什么呢?
这是我的代码:
import sys
test_cases = open(sys.argv[1], 'r')
for test in test_cases:
saver=[]
text=""
textList=[]
positionList=[]
num=0
exists=int()
counter=0
for l in test.strip().split(";"):
saver.append(l)
for i in saver[0].split(" "):
textList.append(i)
for j in saver[1].split(" "):
positionList.append(j)
for i in range(0,len(positionList)):
positionList[i]=int(positionList[i])
accomodator=[None]*len(textList)
for n in range(1,len(textList)):
if n not in positionList:
accomodator[n]=textList[len(textList)-1]
exists=n
for item in positionList:
accomodator[item-1]=textList[counter]
counter+=1
if counter>item:
accomodator[exists-1]=textList[counter]
for word in accomodator:
text+=str(word) + " "
print text
test_cases.close()
1 个回答
这段代码对我来说是有效的:
import sys
def main(name_file):
_file = open(name_file, 'r')
text = ""
while True:
try:
line = _file.next()
disordered_line, numbers_string = line.split(';')
numbers_list = map(int, numbers_string.strip().split(' '))
missing_number = sum(xrange(sorted(numbers_list)[0],sorted(numbers_list)[-1]+1)) - sum(numbers_list)
if missing_number == 0:
missing_number = len(disordered_line)
numbers_list.append(missing_number)
disordered_list = disordered_line.split(' ')
string_position = zip(disordered_list, numbers_list)
ordered = sorted(string_position, key = lambda x: x[1])
text += " ".join([x[0] for x in ordered])
text += "\n"
except StopIteration:
break
_file.close()
print text.strip()
if __name__ == '__main__':
main(sys.argv[1])
我会一步一步解释我的代码,这样你可能能看到你和我代码之间的区别:
while True
这是一个循环,当没有更多行时就会停止。
try:
我把代码放在一个尝试块里,并捕获了停止迭代的异常,因为当生成器里没有更多项目时,就会抛出这个异常。
line = _file.next()
使用生成器,这样你就不会一次性把所有行都放到内存里。
disordered_line, numbers_string = line.split(';')
获取无序的短语和每个字符串的位置数字。
numbers_list = map(int, numbers_string.strip().split(' '))
把每个数字从 string
转换成 int
missing_number = sum(xrange(sorted(numbers_list)[0],sorted(numbers_list)[-1]+1)) - sum(numbers_list)
找出序列中缺失的数字,这个缺失的数字就是短语中最后一个字符串的位置。
if missing_number == 0:
missing_number = len(unorder_line)
检查缺失的数字是否等于0,如果是的话,真正缺失的数字就是构成短语的字符串数量。
numbers_list.append(missing_number)
把缺失的数字添加到数字列表中。
disordered_list = disordered_line.split(' ')
把无序的短语转换成一个列表。
string_position = zip(disordered_list, numbers_list)
把每个字符串和它对应的位置结合起来。
ordered = sorted(string_position, key = lambda x: x[1])
按照字符串的位置对结合后的列表进行排序。
text += " ".join([x[0] for x in ordered])
把排序后的短语连接起来,剩下的代码也很容易理解。
更新
通过查看你的代码,我认为这里有一些建议可能会解决你的问题。
split
已经返回了一个列表,所以你不需要遍历分割后的内容再把它添加到另一个列表里。
所以这六行:
for l in test.strip().split(";"):
saver.append(l)
for i in saver[0].split(" "):
textList.append(i)
for j in saver[1].split(" "):
positionList.append(j)
可以简化成三行:
splitted_test = test.strip().split(';')
textList = splitted_test[0].split(" ")
positionList = map(int, splitted_test[1].split(" "))
在这一行 positionList = map(int, splitted_test[0].split(" "))
你已经把数字转换成了整数,所以可以省去这两行:
for i in range(0,len(positionList)):
positionList[i]=int(positionList[i])
接下来的几行:
accomodator=[None]*len(textList)
for n in range(1,len(textList)):
if n not in positionList:
accomodator[n]=textList[len(textList)-1]
exists=n
可以简化成接下来的四行:
missing_number = sum(xrange(sorted(positionList)[0],sorted(positionList)[-1]+1)) - sum(positionList)
if missing_number == 0:
missing_number = len(textList)
positionList.append(missing_number)
基本上这些行的作用是计算序列中缺失的数字,这样序列的长度就和 textList
一样了。
接下来的几行:
for item in positionList:
accomodator[item-1]=textList[counter]
counter+=1
if counter>item:
accomodator[exists-1]=textList[counter]
for word in accomodator:
text+=str(word) + " "
可以用这些来替代:
string_position = zip(textList, positionList)
ordered = sorted(string_position, key = lambda x: x[1])
text += " ".join([x[0] for x in ordered])
text += "\n"
这样你可以节省行数和内存,同时使用 xrange 替代 range
。
可能导致你的代码部分通过的因素有:
- 脚本的行数
- 脚本运行所需的时间。
- 脚本使用的内存。
你可以尝试:
- 使用生成器。#这样可以节省内存
- 减少
for
循环,这样可以节省代码行数和时间。 - 如果你觉得某些事情可以做得更简单,就去做。
- 不要重复造轮子,如果某件事已经被做过,就直接使用它。