2015-11-16 3 views
0

У меня есть этот код, который принимает txt-файл, который выводит список стран.Выбор Сортировка

def readCountries(filename): 
    result=[] 
    lines=open(filename) 

    for line in lines: 
     result.append(line.strip('\n').split(',\t')) 
    for sublist in result: 
     sublist[1]=float(sublist[1]) 
     sublist[2]=int(sublist[2]) 

    return result 

Я пытаюсь создать выбор сортировки, который сортирует список по численности населения в порядке убывания, и будет печатать информацию.

Вот мой код, что я делаю неправильно?

def countryByPop(population): 
    myList=readCountries('countries.txt') 

    for i in range(0,len(myList)): 
     largest = i 
     for j in range(i,len(myList)): 
      if myList[j]<myList[smallest]: 
       smallest = j 
     temp = myList[i] 
     myList[i] = myList[smallest] 
     myList[smallest] = temp 

    if population range(0,len(myList)) 
     return temp 
    else: 
     print "Invalid Parameter: %s" %(population) 

ответ

0

Во-первых, вы определяете переменную largest и никогда не использовать его снова. Затем вы используете неопределенную переменную smallest. Я предполагаю, что вы хотели изменить все экземпляры smallest на largest, а largest должен быть индексом в списке, указывающим на страну с наибольшей совокупностью. Вы должны изменить все экземпляры smallest на largest.

Чтобы отсортировать по убыванию, вы хотите найти самый большой элемент на каждой итерации внешнего цикла, а затем переместите его на myList[i]. Однако, тестируя myList[j] < myList[smallest], вы в конечном итоге перемещаете самый маленький элемент в начало списка. Вы должны изменить это на > вместо <. Таким образом, внутренняя петля найдет страну с большей численностью населения, чем та, на которую указывает largest.

Кроме того, ваше заявление if фактически не проверяет население страны. Каждый элемент myList - это список. Таким образом, вы сравниваете список со списком. Вместо этого вы хотите сравнить элемент списка. Если третий элемент вашего списка хранит популяцию, то заявление должно читать myList[j][2] > myList[largest][2]. Обратите внимание на второй набор фигурных скобок для доступа к этому элементу населенности.

def countryByPop(population): 
    myList=readCountries('countries.txt') 

    for i in range(0,len(myList)): 
     largest = i 
     for j in range(i, len(myList)): 
      if myList[j][2] > myList[largest][2]: 
       largest = j 
     temp = myList[i] 
     myList[i] = myList[largest] 
     myList[largest] = temp 

    if population < len(myList): 
     return myList[population-1] 
    else: 
     print "Invalid Parameter: %s" % (population) 

Если параметр population предназначен для получения п-й самого густонаселенной страны, то вы получите эту деталь myList[population-1]. Использование range() в инструкции if было ненужным. Код отражает это изменение. Вы должны использовать лучшее имя, чем population, чтобы уточнить намерение, например country_rank.

+0

Спасибо! Как бы я вывел место в списке, где введенный параметр? – user5473706

+0

Ваш вопрос непонятен. Что вы имеете в виду? Вам нужен индекс страны, население которой соответствует населению, которое вы проходите? – Noah

+0

Да, я не уверен, как вывести его. Скажем, когда я вхожу в countryByPop (18), я хочу напечатать 18-ю наиболее населенную страну, которая будет 18-м значением в списке – user5473706

0

Вы не возвращаете mylist

def countryByPop(population): 
    ... 
    return mylist 

Вы также должны быть ясно, о том, что переменные smallest и largest означают. Я не вижу, где smallest назначается до его использования.

Предполагая, что название страны является первым элементом в записи, вы должны сравнивать myList[j][1] < myList[smallest][1], например, если население является вторым элементом

наконец, в Python, вы можете написать эти три строки

temp = myList[i] 
    myList[i] = myList[smallest] 
    myList[smallest] = temp 

, как один

myList[i], myList[smallest] = myList[smallest], myList[i] 
+0

ли я написать обратный MyList в если заявлении?Или сохранить температуру возврата? – user5473706

0

Попробуйте это в jquery, это очень просто.

вара = функция сортировки выбора (A) {

 for (var i = 0; i < A.length; i++) { 
      var imin = i; 
       for (var j = i + 1; j <= A.length; j++) { 
        if (A[j] < A[imin]) 
         imin = j; 
       } 
       var tmp = A[i]; 
       A[i] = A[imin]; 
       A[imin] = tmp; 
     } 
     return A; 
    }; 
    var A = [10, 20, 30, 40, 50, 60, 70, 80]; 
    var Aftersorted = Selectionsort(A); 
    console.log(Aftersorted); 
Смежные вопросы