2011-02-10 28 views
7

タプルのリストの動的リストで最高の値を取得するのに問題があります。
一覧することができますが、次のようになります。今タプルのリストの最大値

adymlist = [[('name1',1)],[('name2',2),('name3',1), ...('name10', 20)], ...,[('name m',int),..]] 

Iループを一覧を通じて最高値(整数)を取得するために:私は最大値を取得するために多くのことを試みたが、私が見つけた

total = {} 
y=0 
while y < len(adymlist): 
    if len(adymlist) == 1: 
     #has the List only 1 Element -> save it in total 
     total[adymlist[y][0][0]] = adymlist[y][0][1] 
     y += 1 
    else: 
     # here is the problem 
     # iterate through each lists to get the highest Value 
     # and you dont know how long this list can be 
     # safe the highest Value in total f.e. total = {'name1':1,'name10':20, ..} 

を私の問題に結論はありません。リストの各タプルをループして次のタプルと比較しなければならないが、それを正しい方法でコードする方法はわからない。

また、私は関数max()を使用できますが、文字列と整数では機能しません。 f.e. a = [ ('a',5),('z',1)] - >結果はmax(a) ---> ('z',1) obv 5> 1ですが、z> aなので、max(a, key=int)でmax関数を拡張しようとしましたが、タイプエラーが発生します。

あなたは私がこれまで;-)

UPDATE

おかげで欲しいものを理解することができます願っています。

私はitertools.chain(*adymlist)max(flatlist, key=lambda x: x[1])
を使用している場合は、私が得るような例外:max_word = MAX(flatlist、キー=ラムダX:X [1]) はTypeError:「int型のオブジェクトは、

けど場合unsubscriptableですitertools.chain(adymlist)を使っても問題ありません。しかし、リストの各タプルからすべての整数を合計する方法はわかりません。私はそれを理解するためにあなたの助けが必要です。

それ以外の場合は、itertools.chain(*adymlist)の回避策を書いて、すべての整数とそのリスト内の最も高い整数の合計を取得してください。

chain = itertools.chain(*adymlist) 
flatlist = list(chain) 
# flatlist = string, integer, string, integer, ... 
max_count = max(flatlist[1:len(flatlist):2]) 
total_count = sum(flatlist[1:len(flatlist):2]) 
# index of highest integer 
idx = flatlist.index(next((n for n in flatlist if n == max_count))) 
max_keyword = flatlist[idx-1] 

それはまだ私が何をしたいんが、汚れていないのですか?

答えて

16

明確にするために、タプルのリストのリストがあるようです。我々は彼らが何であるかをリスト気にようにそれは見ていないので、私たちは

  • が最大値を探す2つの段階

    • タプルのリストにリストのリストを平らにするために、これを簡略化することができ

    最初の部分はitertools.chainを介して達成することができる(例えば、Flattening a shallow list in Pythonを参照)は、第2のマックスを通じて解決することができる

    、あなたは正しい考えを持っていますが、機能ではなく、あなたが望むタイプに渡すべきです。この機能を使用すると、上のキーてきた値を返す必要があり、この場合には、タプル

    max(flatlist, key=lambda x: x[1]) 
    

    修正

    の2番目の部分は、私はあなたの質問を再読み込み - あなたは最大を探しています各サブリストの値?この場合、2番目の部分のみが適用されます。単純にもう少しニシキヘビあなたが現在持っているものよりも、各リスト

    ためのあなたのリストを反復する

    output = [] 
    for lst in lists: 
        output.append(max(flatlist, key=lambda x: x[1])) 
    

    または

    map(lambda x: max(x, key=lambda y: y[1]) , lists) 
    
  • 4

    をしたいと思いspintheblackが言うように、あなたはタプルのリストのリストを持っています。私はあなたがすべてのタプルの中で最も高い整数値を探していると推測します。

    あなたは、このようなタプルのタプルのリストの上に、外側のリストを反復処理することができます。

    max_so_far = 0 
    for list in adymlist: 
        for t in list: 
        if t[1] > max_so_far: 
         max_so_far = t[1] 
    print max_so_far 
    

    これは少しより冗長ですが、理解しやすいかもしれません。

    関連する問題