这就是我要做的事情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()
答案 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
。
可能导致代码部分传递的因素可能是:
你能做的是:
for
,这样可以节省代码和时间。