Pythonのリストindex()メソッドのリストタプルやオブジェクトは?
-
09-09-2019 - |
質問
Pythonのリストタイプを指標()メソッドは、一つのパラメータのインデックスを返します最初の項目リストマッチングのパラメータとします。たとえば、次のようになります。
>>> some_list = ["apple", "pear", "banana", "grape"]
>>> some_list.index("pear")
1
>>> some_list.index("grape")
3
あやかな、物腰の優(慣用句)を拡大するリストの複雑なオブジェクトのように、タプル?理想的には、持ってき方など、さすがだなと私なんて思ったこと。
>>> tuple_list = [("pineapple", 5), ("cherry", 7), ("kumquat", 3), ("plum", 11)]
>>> some_list.getIndexOfTuple(1, 7)
1
>>> some_list.getIndexOfTuple(0, "kumquat")
2
getIndexOfTuple()は、仮想的な方法を受け入れるサブインデックスと、その値のインデックスを返しますリストの項目を、指定された値がサブ指数です。願い
る方法はありま達と一般の結果、リストの理解やlambasは何か"をインライン"はいけないと思います。と思いを書き、自分のクラスとメソッドが、たくない管理ソリューションを提供輪場合はPythonについて教えてください。
解決
これはどう?
>>> tuple_list = [("pineapple", 5), ("cherry", 7), ("kumquat", 3), ("plum", 11)]
>>> [x for x, y in enumerate(tuple_list) if y[1] == 7]
[1]
>>> [x for x, y in enumerate(tuple_list) if y[0] == 'kumquat']
[2]
コメントで指摘したように、これはすべての試合になるだろう。ただ最初の1を取得するには、あなたが行うことができます:
>>> [y[0] for y in tuple_list].index('kumquat')
2
投稿されたすべてのソリューションとの速度差についてのコメントで良い議論があります。あなたは、非常に大量にこれを行う上で計画している場合、私は少しバイアスすることができるが、我々が話している速度は関数を作成し、この問題のためのモジュールをインポートする対かなり軽微であると私は個人的にはワンライナーに固執だろうが、要素のあなたは、彼らは私が提供するものよりも高速であるため、提供された他の回答を見てみたいことがあります。
他のヒント
これらのリストの内包表記はしばらく厄介です。
私はこのPython的なアプローチを好む:
from operator import itemgetter
def collect(l, index):
return map(itemgetter(index), l)
# And now you can write this:
collect(tuple_list,0).index("cherry") # = 1
collect(tuple_list,1).index("3") # = 2
あなたはすべてのスーパーパフォーマンスであるためにあなたのコードが必要な場合:
# Stops iterating through the list as soon as it finds the value
def getIndexOfTuple(l, index, value):
for pos,t in enumerate(l):
if t[index] == value:
return pos
# Matches behavior of list.index
raise ValueError("list.index(x): x not in list")
getIndexOfTuple(tuple_list, 0, "cherry") # = 1
一つの可能性にも利用され itemgetter 機能から operator
モジュール:
import operator
f = operator.itemgetter(0)
print map(f, tuple_list).index("cherry") # yields 1
を呼び出 itemgetter
を返す機能が同等の foo[0]
のために何も渡されます。を使用 map
, ましこの機能は、各タプルを抽出し、情報を新規リストでいうんてんめんきょしょうにほんを呼び出して、 index
しています。
map(f, tuple_list)
に相当す:
[f(tuple_list[0]), f(tuple_list[1]), ...etc]
それは、次の操作に相当します。
[tuple_list[0][0], tuple_list[1][0], tuple_list[2][0]]
る:
["pineapple", "cherry", ...etc]
あなたはリスト内包とインデックスでこれを行うことができます()
tuple_list = [("pineapple", 5), ("cherry", 7), ("kumquat", 3), ("plum", 11)]
[x[0] for x in tuple_list].index("kumquat")
2
[x[1] for x in tuple_list].index(7)
1
私は三部作にコメントとしてこれを置くだろうが、私は原因の評価の欠如にはまだコメントすることはできません。
タプルのリストにサブインデックスに一致する列挙方法を使用。 例えばます。
li = [(1,2,3,4), (11,22,33,44), (111,222,333,444), ('a','b','c','d'),
('aa','bb','cc','dd'), ('aaa','bbb','ccc','ddd')]
# want pos of item having [22,44] in positions 1 and 3:
def getIndexOfTupleWithIndices(li, indices, vals):
# if index is a tuple of subindices to match against:
for pos,k in enumerate(li):
match = True
for i in indices:
if k[i] != vals[i]:
match = False
break;
if (match):
return pos
# Matches behavior of list.index
raise ValueError("list.index(x): x not in list")
idx = [1,3]
vals = [22,44]
print getIndexOfTupleWithIndices(li,idx,vals) # = 1
idx = [0,1]
vals = ['a','b']
print getIndexOfTupleWithIndices(li,idx,vals) # = 3
idx = [2,1]
vals = ['cc','bb']
print getIndexOfTupleWithIndices(li,idx,vals) # = 4
この質問私は、これは非常にエレガント見つけます:
>>> tuple_list = [("pineapple", 5), ("cherry", 7), ("kumquat", 3), ("plum", 11)]
>>> next(i for i, t in enumerate(tuple_list) if t[1] == 7)
1
>>> next(i for i, t in enumerate(tuple_list) if t[0] == "kumquat")
2
[OK]を、それはvals(j)
で間違いかもしれないが、補正がされます:
def getIndex(li,indices,vals):
for pos,k in enumerate(lista):
match = True
for i in indices:
if k[i] != vals[indices.index(i)]:
match = False
break
if(match):
return pos
tuple_list = [("pineapple", 5), ("cherry", 7), ("kumquat", 3), ("plum", 11)]
def eachtuple(tupple, pos1, val):
for e in tupple:
if e == val:
return True
for e in tuple_list:
if eachtuple(e, 1, 7) is True:
print tuple_list.index(e)
for e in tuple_list:
if eachtuple(e, 0, "kumquat") is True:
print tuple_list.index(e)
z = list(zip(*tuple_list))
z[1][z[0].index('persimon')]
いいえ体がラムダを示唆していますか?
Yは、この作品としてみてください。私は答えを探して、このポストに来ます。私は私が好きなことがわかっていないが、私はinsingth感じる:Pを
l #[['rana', 1, 1], ['pato', 1, 1], ['perro', 1, 1]]
map(lambda x:x[0], l).index("pato") #1
編集例を追加します:
l=[['rana', 1, 1], ['pato', 2, 1], ['perro', 1, 1], ['pato', 2, 2], ['pato', 2, 2]]
の条件ですべての項目を抽出します。 フィルタ(ラムダX:X [0] == "パト"、L)#[[ 'パト'、2、1]、[ 'パト'、2,2]、[ 'パト'、2,2]
インデックスと条件により、すべての項目を抽出します:
>>> filter(lambda x:x[1][0]=="pato", enumerate(l))
[(1, ['pato', 2, 1]), (3, ['pato', 2, 2]), (4, ['pato', 2, 2])]
>>> map(lambda x:x[1],_)
[['pato', 2, 1], ['pato', 2, 2], ['pato', 2, 2]]
注:_変数のみ割り当てるexplicti必要_インタラクティブインタプリタY通常のテキストファイルで動作し、すなわち_ =フィルタ(ラムダX:X [1] [0] == "パト"、(l)を列挙する)
Pythonのlist.index(x)は、リスト内のxの最初の発生の指標を返します。だから我々は彼らのインデックスを取得するには、リストの圧縮によって返されるオブジェクトを渡すことができます。
>>> tuple_list = [("pineapple", 5), ("cherry", 7), ("kumquat", 3), ("plum", 11)]
>>> [tuple_list.index(t) for t in tuple_list if t[1] == 7]
[1]
>>> [tuple_list.index(t) for t in tuple_list if t[0] == 'kumquat']
[2]
同じラインで、我々はまた、複数の一致した要素がある場合には、インデックスのリストを取得することができます。
>>> tuple_list = [("pineapple", 5), ("cherry", 7), ("kumquat", 3), ("plum", 11), ("banana", 7)]
>>> [tuple_list.index(t) for t in tuple_list if t[1] == 7]
[1, 4]
私は次はそれ(スピードと優雅さの懸念)を行うための最善の方法ではありませんと思いますが、まあ、それは助けることができます:
from collections import OrderedDict as od
t = [('pineapple', 5), ('cherry', 7), ('kumquat', 3), ('plum', 11)]
list(od(t).keys()).index('kumquat')
2
list(od(t).values()).index(7)
7
# bonus :
od(t)['kumquat']
3
2人のメンバーとのタプルのリストは、直接注文辞書に変換することができ、データ構造は、実際には同じですので、我々はその場でのdictメソッドを使用することができます。