2017-02-13 10 views
1

サブリストで構成されたリストの中で、最も小さな番号を見つけようとしています。 プログラムの出力は次のように行く必要があります。サブリストの比較方法

least([[2,4,3],[1,7,9,4]]) 
in [[2,4,3],[1,7,9,4]] the least number is 1 found in sublist [1,7,9,4] 

これまでのところ私は、リスト内の最小の数を見つけ、コードを持っており、それがサブリストを出力しますが、どのように私はそれらを一緒に結合するか、それは本当に私の問題です。

# finds smallest number in list 
def test(list1): 
    x = list1[0] 
    for i in list1: 
     if i < x: 
      x = i 
    print(x) 

# prints out sublists 
def test2(num): 
    for x in num: 
     for y in x: 
      print (y, end = " ") 
     print("") 

「テスト」の本体は、サブリストは、あなたが見て最低値を含む変数を維持することによって、これを行うことができる唯一のレベルの深さであることを仮定すると、ラインの前か後

for y in x: 
+1

フォーマットあなたのコードください –

+0

あなたは**再帰またはスタック/キュー**使用する必要があります。リストはネストされている可能性があります。つまり、アイテム内の最小アイテム(別の類似リスト)を検索する必要があるため、すべてのアイテムの結果を比較します。 –

+0

また、常にネストのレベルを1つにしますか?あるいは、n次元のリストをサポートしたいですか? –

答えて

4

Pythonはbuilt-in min functionを持っています。しかし、私はそれが自分自身を書くための良い学習練習だと思う。

test関数の修正版を作成することによって、最小要素を含むサブリストを見つける関数を書くことができます。

重要なアイデアは、各サブリストの最小値を見つけることです。新しい最小値が見つかると、その最小値のサブリストが保存されます。

以下のコードでは、より意味のあるものにするために、関数名をtestからminimumに変更しました。

def minimum(list1): 
    ''' Finds smallest item in list1 ''' 
    x = list1[0] 
    for i in list1: 
     if i < x: 
      x = i 
    return x 

def least(list2d): 
    minseq = list2d[0] 
    x = minimum(minseq) 
    for seq in list2d[1:]: 
     i = minimum(seq) 
     if i < x: 
      x = i 
      minseq = seq 
    print('In {} the least number is {} found in sublist {}'.format(list2d, x, minseq)) 

# Test 

data = [[2, 4, 3], [1, 7, 9, 4], [6, 7, 5]] 
least(data) 

出力

In [[2, 4, 3], [1, 7, 9, 4], [6, 7, 5]] the least number is 1 found in sublist [1, 7, 9, 4] 

しかし、私たちは私たちのために、最小のサブリストを見つけるために、ビルトインmin機能を使用することにより、よりコンパクトな方法でこれを書くことができます。ここでのトリックは、minを呼び出して各サブリストの最小項目を見つけ出し、それらの最小値を使用してどのサブリストが最小のものかを判断することです。

def least(list2d): 
    minseq = min(list2d, key=min) 
    x = min(minseq) 
    print('In {} the least number is {} found in sublist {}'.format(list2d, x, minseq)) 

このバージョンでは、最小アイテムを2回持つサブリストの最小値を計算するため、わずかに非効率です。我々はminジェネレータ式渡すことができないようにするには:

def least(list2d): 
    x, minseq = min((min(seq), seq) for seq in list2d) 
    print('In {} the least number is {} found in sublist {}'.format(list2d, x, minseq)) 

式は、各サブリストとその最小値のタプルを作成し、発電機、それらのタプルは、最小の最小を含むタプルを見つけるために、外側minコールに渡されます。2つ以上のタプルが最小値を結んでいる場合、タプル自体を比較して勝者を決定します。

1

を行っています、そして別のその値が含まれてリストを追跡するために:

lists = [[2, 4, 3], [1, 7, 9, 4]] 

min_list = None 
min_value = lists[0][0] # initialse to the first item of the first list 

for sublist in lists: 
    min_ = min(sublist) 
    if min_ < min_value: 
     min_value = min_ 
     min_list = sublist 

print("the least number is {} found in sublist {}".format(min_value, min_list)) 
+0

あなたの最初の仮定はコメントからの明確化に基づいて正しくありません –

+0

@MadPhysicist明確化はさらに明らかになりました。 ;) –

+0

だからです。そこでの命名の衝突のビット –

0

ショートとシンプル:

>>> lst = [[2, 4, 3], [1, 7, 9, 4]] 
>>> min_value_in_lst = min(min(sublist) for sublist in lst) 
1 

あなたが値分それがどこから来たのかを知りたい場合は、単にループを作成します。

for sublist in lst: 
    if min_value_in_lst in sublist: 
     return sublist 

フル機能:

def least(lst): 
    min_value_in_lst = min(min(sublist) for sublist in lst) 
    that_sublist = None 

    for sublist in lst: 
     if min_value_in_lst in sublist: 
      that_sublist = sublist 
      break 

    # print out the result 
0

あなたはこの単純なコードを試した後、対処するためのニシキヘビの方法が必要な場合: -

a = [[2,4,3],[1,7,9,4]] 
min(reduce(lambda x,y : x+y, a)) 

Output:- 
1 
+0

これは、最小アイテムを含むサブリストを特定しません。 –

関連する問題