为什么这个不正确?(codeeval挑战)PYTHON

-2 投票
1 回答
1450 浏览
提问于 2025-04-18 15:26

这是我需要做的事情: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 个回答

2

这段代码对我来说是有效的:

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

可能导致你的代码部分通过的因素有:

  1. 脚本的行数
  2. 脚本运行所需的时间。
  3. 脚本使用的内存。

你可以尝试:

  1. 使用生成器。#这样可以节省内存
  2. 减少 for 循环,这样可以节省代码行数和时间。
  3. 如果你觉得某些事情可以做得更简单,就去做。
  4. 不要重复造轮子,如果某件事已经被做过,就直接使用它。

撰写回答