1

さて、ちょっと問題があります。申し訳ありませんが、Python は初めてです。

数字であるスコアでリストを並べ替えようとしていますが、引き分けの場合は名前の長さで並べ替える必要があり、名前が短いほどランクが高くなります。

だから私はここにこのリストを持っています

11 Jenny
8 Adam
10 Mark
8 Ada

ここでこのコードを使用すると、次のように返されます

11 Jenny
10 Mark
10 Mark
10 Mark

def sort(names, counts):
    newArr = []
    newNames = names
    newCount = counts
    for x in range(0, len(names)):
        newArr.append(findBiggest(newNames, newCount))
        for z in range(0, len(names)):
            name = newArr[len(newArr) - 1].split(" ")[1]
            print name 
            if names[z] == name:
                tempArr1 = newNames
                tempArr2 = newCount
                newNames = []
                newCount = []
                for y in range(0, len(tempArr1)):
                    if y != z:
                        newNames.append(tempArr1[y])
                        newCount.append(tempArr2[y])
    return newArr
def findBiggest(names, counts):
    biggest = 0;
    for x in range(0, len(counts)):
        if int(counts[x]) > biggest:
            biggest = int(counts[x])
    biggestCountArr = [[], []]
    for x in range(0, len(counts)):
        if int(counts[x]) == biggest:
            biggestCountArr[0].append(counts[x])
            biggestCountArr[1].append(names[x])
    if len(biggestCountArr[0]) == 1:
        return str(biggestCountArr[0][0]) + " " + biggestCountArr[1][0]
    else:
        return smallestLength(biggestCountArr)
def smallestLength(twoDArr):
    names = twoDArr[1]
    shortestLen = 0
    for x in range(0, len(names)):
        if len(names[x]) > shortestLen:
            shortestlen = len(names[x])
    for x in range(0, len(names)):
        if len(names[x]) == shortestLen:
            return str(twoDArr[0][x]) + " " + twoDArr[1][x]

ちょうどあなたが知っているので

11 Jenny
8 Adam
10 Mark
8 Ada

として出てくるはずです

11 Jenny
10 Mark
8 Ada
8 Adam
4

3 に答える 3

11
lst=[(11, "Jenny"),(8, "Adam"),(10, "Mark"),(8, "Ada")]
lst.sort(key=lambda x: (-x[0],len(x[1])) )
print (lst) # [(11, 'Jenny'), (10, 'Mark'), (8, 'Ada'), (8, 'Adam')]

list メソッドsortと組み込み関数は、callable が与えられたsortedキーワード引数を受け入れます。key基本的に、シーケンス内のすべての要素について、その要素が関数に渡され、そのkey関数の戻り値は、実際には Python がソート時の順序を決定するために使用するものです。したがって、上記ではlambda、入力要素からタプルを返す関数を作成するために使用します。タプルは順序付けられてfirst_element, lenth_of_second_elementいます。

タプル (またはリスト) を比較するときは、文字列を比較するのとよく似ています。最初の要素を見て、それらが同じであれば、2 番目の要素、次に 3 番目というように、1 つの要素が他の要素よりも大きくなるまで続けます。例えば

(1,2,3,4) > (1,2,3,3) #True

これは、非常に興味深い方法でソートするのに便利です。

これを締めくくると思いますが、python がソートに使用するアルゴリズムはstableであることに言及する必要があります。これは、keyA で並べ替えてから keyB で並べ替えた場合、keyB に基づいて等しいと比較された 2 つの要素は、keyA を使用して並べ替えた後の順序を維持することを意味します。つまり、並べ替えによって、値が等しい要素の順序が変更されることはありません。したがって、上記は次のように実行することもできます。

lst.sort(key=lambda x:len(x[1]))  #sort by length of names
lst.sort(key=lambda x:x[0], reversed=True) #sort by score (highest first instead of regular lowest first)

そして、それをよりエレガントに説明する何かへのリンクがなければ、答えは完全ではないと思います。(具体的には、「キー機能」のセクションを参照してください)

于 2012-07-31T02:05:17.670 に答える
0

各行を繰り返し処理し、sortそれらに対してメソッドを使用する必要があります

#open the file and read through the lines.
lines = open('yourfile.txt').readlines()

#iterate over each line, and split along the spaces 
pairs =[]
for line in lines:
   split_string = line.split('')
   num = int(split_string[0])
   pairs.append((num, split_string[1:])

#sort through the pairs (from mgilsons answer)
pairs.sort(key=lambda x: (x[0],len(x[1]))

編集:実際に質問を読み間違えました。

于 2012-07-31T02:11:24.513 に答える
0
aList = [
    (11, 'Jenny'),
    (8, 'Adam'),
    (10, 'Mark'),
    (8, 'Ada'),
]

aList.sort(lambda x, y: y[0] - x[0])
print aList
于 2012-07-31T02:44:50.217 に答える