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

时间:2014-07-31 01:07:24

标签: python python-2.7

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

答案 0 :(得分: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:

我将代码置于try中并捕获StopIteracion异常,因为当生成器中没有其他项时会引发此异常。

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(" "))你已经将数字转换为int,所以你保存这两行:

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)

基本上这些线的作用是计算数字系列中的缺失数字,因此系列的len与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. 脚本使用的内存数量。
  4. 你能做的是:

    1. 使用生成器。 #You save memory
    2. 减少for,这样可以节省代码和时间。
    3. 如果您认为某些事情可以变得更容易,那就去做吧。
    4. 不要重做方向盘,如果已经制作了它,请使用它。