文字列のリストを数値で並べ替える方法は?


128

これは些細なことのように聞こえることは知っていsort()ますが、Python の機能が奇妙なものであることを知りませんでした。実際には文字列形式の「数値」のリストがあるので、まずそれらをintに変換してから、ソートを試みます。

list1=["1","10","3","22","23","4","2","200"]
for item in list1:
    item=int(item)

list1.sort()
print list1

くれます:

['1', '10', '2', '200', '22', '23', '3', '4']

私が欲しいのは

['1','2','3','4','10','22','23','200']

数値セットのソートに関連するアルゴリズムのいくつかを調べましたが、私が見つけたものはすべて、英数字セットのソートに関係しています。

私はこれはおそらく簡単な問題ではないことを知っていますが、グーグルと私の教科書は.sort()関数よりも多かれ少なかれ有用なものを提供していません。


9
あなたのforループは、あなたが思っているとは思わないことをすることに注意してください。
2010

1
更新はありませんでしたlist1list更新されたと思ったのはなぜですか?
S.Lott、2010

list1 = ['1'、 '1.10'、 '1.11'、 '1.1'、 '1.2']が入力として提供されている場合、同様の問題が発生します。['1'、 '1.1'、 '1.2'、 '1.10'、 '1.11']として出力を取得する代わりに、['1'、 '1.1'、 '1.10'、 '1.11'、 '1.2'を取得しています]
熱心な

2
Python 3で使用する場合がありますsorted(mylist)
Akin Hwan

回答:


191

実際には文字列をintに変換していません。むしろ、そうしたのですが、その結果については何もしませんでした。あなたが欲しいのは:

list1 = ["1","10","3","22","23","4","2","200"]
list1 = [int(x) for x in list1]
list1.sort()

何らかの理由でintの代わりに文字列を保持する必要がある場合(通常は悪い考えですが、先行ゼロなどを保持する必要がある場合があります)、キー関数を使用できます。sort名前付きパラメーターを受け取ります。keyこれは、各要素が比較される前に呼び出される関数です。リスト要素を直接比較するのではなく、キー関数の戻り値が比較されます。

list1 = ["1","10","3","22","23","4","2","200"]
# call int(x) on each element before comparing it
list1.sort(key=int)

8
2.7でkey = intを試すと、None
KI4JGTが

1
リスト要素が「整数」として格納されている場合、これは機能しますが、浮動小数点値の場合はどのように処理されますか?例:list1 = [
1、1.10、1.11、1.1、1.2

1
@ KI4JGT sortメソッドはリストを変更し、Noneを返します。したがって、の代わりにlist1 = list1.sort(key=int)just list1.sort(key=int)を使用すると、list1はすでにソートされています。
Josiah Yoder

1
@ KI4JGT .sort()はインプレース演算子であり、Noneを返します。リストを並べ替えます
。sorted

39

あなたはに関数を渡すことができますkeyへのパラメータの方法。これにより、システムはxではなくkey(x)でソートされます。.sort

list1.sort(key=int)

ところで、リストを永続的に整数に変換するには関数を使用mapます

list1 = list(map(int, list1))   # you don't need to call list() in Python 2.x

または内包表記

list1 = [int(x) for x in list1]

21

sorted()関数を使用したい場合:sorted(list1, key=int)

新しいソートされたリストを返します。


1
セットでも使えます!
MT

12

Pythonのソートは奇妙ではありません。このコードだけです:

for item in list1:
   item=int(item)

あなたが思っていることをしていない- itemリストに戻されず、単に捨てられます。

とにかく、正しい解決策はkey=int、他の人があなたに示したように使用することです。


12

次のものも使用できます。

import re

def sort_human(l):
    convert = lambda text: float(text) if text.isdigit() else text
    alphanum = lambda key: [convert(c) for c in re.split('([-+]?[0-9]*\.?[0-9]*)', key)]
    l.sort(key=alphanum)
    return l

これは、インターネットで見つけることができる他のものとよく似ていますが、などの英数字でも機能し[abc0.1, abc0.2, ...]ます。


8

Seamus Campbellの答えはpython2.xでは機能しません。関数
list1 = sorted(list1, key=lambda e: int(e))を使用lambdaするとうまくいきます。


8

私は昨日同じ問題に取り組み、[natsort] [1]と呼ばれるモジュールを見つけました。これはあなたの問題を解決します。使用する:

from natsort import natsorted # pip install natsort

# Example list of strings
a = ['1', '10', '2', '3', '11']

[In]  sorted(a)
[Out] ['1', '10', '11', '2', '3']

[In]  natsorted(a)
[Out] ['1', '2', '3', '10', '11']

# Your array may contain strings
[In]  natsorted(['string11', 'string3', 'string1', 'string10', 'string100'])
[Out] ['string1', 'string3', 'string10', 'string11', 'string100']

また、と同等の辞書としても機能しsortedます。[1]:https : //pypi.org/project/natsort/


3

これを試してください。リストを降順に並べ替えます(この場合、キーを指定する必要はありません)。

処理する

listB = [24, 13, -15, -36, 8, 22, 48, 25, 46, -9]
listC = sorted(listB, reverse=True) # listB remains untouched
print listC

出力:

 [48, 46, 25, 24, 22, 13, 8, -9, -15, -36]

0

最新のソリューションが正しいです。ソリューションを文字列として読み取ります。この場合、順序は1、100、104、2、21、2001001010、3と続きます。

代わりに、入力をintとしてキャストする必要があります。

ソートされた文字列:

stringList = (1, 10, 2, 21, 3)

ソートされた整数:

intList = (1, 2, 3, 10, 21)

キャストするには、stringListをint(blahblah)の中に入れます。

再び:

stringList = (1, 10, 2, 21, 3)

newList = int (stringList)

print newList

=> returns (1, 2, 3, 10, 21) 

1
TypeError:int()引数は「タプル」ではなく文字列または数値でなければなりません
Cees Timmerman

また、stringListの文字列には引用符が必要です。
Teepeemm、2015年

2
「最新の解決策は正しい」;)
GreenAsJade

0

数値の文字列を使用したい場合は、私のコードに示すように別のリストを使用することをお勧めします。

list1=["1","10","3","22","23","4","2","200"]

k=[]    
for item in list1:    
    k.append(int(item))

k.sort()
print(k)
# [1, 2, 3, 4, 10, 22, 23, 200]

0

数値リストを並べ替える簡単な方法

numlists = ["5","50","7","51","87","97","53"]
results = list(map(int, numlists))
results.sort(reverse=False)
print(results)

-1

実際の問題は、並べ替えがアルファベット順に並べ替えることです。したがって、リスト['1'、 '2'、 '10'、 '19']があり、並べ替えを実行すると、['1'、 '10'が得られます。'19'、 '2']。つまり、10は最初の文字を見てそれからソートするため、2の前に来ます。Pythonのほとんどのメソッドは、この順序で物事を返すようです。たとえば、1.jpg、2.jpgなどのラベルが付いたファイルを含むabcというディレクトリがあり、15.jpgまでと言う場合、file_list = os.listdir(abc)を実行すると、file_listは期待どおりに並べられず、次のようになります。 file_list = ['1.jpg'、'11 .jpg '---' 15.jpg '、' 2.jpg]。ファイルが処理される順序が重要である場合(おそらくそれがファイルに数値で名前を付けた理由です)、順序は予想どおりではありません。「ゼロ」パディングを使用すると、これを回避できます。たとえば、リストalist = ['01'、 '03'、 '05'、 '10'、 '02'、 '04'、'06]があり、それに対して並べ替えを実行すると、希望する順序が得られます。alist = ['01'、 '02' etc]最初の文字は0なので、1の前になります。必要なゼロパディングの量は、リスト内の最大値によって決まります。たとえば、最大値が100から1000 001、002 --- 010、011〜100、101などの1桁を埋め込む必要があります。


-5
scores = ['91','89','87','86','85']
scores.sort()
print (scores)

これは、バージョン2では機能しませんでしたが、Pythonバージョン3を使用して動作しました。


3
そこで「11」と「100」で並べ替えてみてください。そのときが面白くなります。
Penz
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.