2017-02-13 2 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

또한 항상 중첩 수준이 한 가지입니까? 또는 n 차원 목록을 지원 하시겠습니까? –

답변

4

파이썬은 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)) 

이 버전은 가장 작은 항목이 두 번있는 하위 목록의 최소값을 계산하므로 약간 비효율적입니다. 우리가 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

최소 항목을 포함하는 하위 목록을 식별하지 않습니다. –

관련 문제