2016-06-03 1 views
2

나는 다음과 같이 그것의 정수로, 목록의 목록을 가지고 : 정수 1을 감안할 때목록의 목록에서 정수가 얼마나 많은 고유 한 항목을 찾았습니까?

[[[1, 2, 3], [4, 5, 6, 7]], [[3, 7, 5], [1, 2, 4, 6]]] 

, 나는

[2, 3, 4, 6] 

를 반환하는 기능을하기 위해 어떤 방법을 싶습니다 현재 방법은 다음과 같습니다.

bigList = [[[1, 2, 3], [4, 5, 6, 7]], [[3, 7, 5], [1, 2, 4, 6]]] 
hasBeenWith = [] 
integer = 1 
for medList in bigList: 
    for smallList in medList: 
     if integer in smallList: 
      hasBeenWith = hasBeenWith + list(set(smallList) - set(hasBeenWith)) 

나는 이것이 순진한 알고리즘이라는 것을 알고 있습니다. 더 나은, pythonic 방법은 무엇입니까?

+0

을 꽤 질문을하지 않습니다. 당신은 정수 1? – Jerrybibo

+0

를 입력하여 목록의 반환을 일으키는 원인이되는 "규칙"을 명확히 할 수 @ Jerrybibo 나는 모든 다른 항목 1이 목록에 있었다는 리턴을 원한다. 그래서 만약 내가 2를 넣으면 1, 3, 4, 6을 얻을 것이다. 왜냐하면 그것들은 모두 정수 2가리스트에 있기 때문이다. 당신이 물어 본 것입니까? –

+0

당신은 출력 세트를 찾고 있습니다. 성. –

답변

2

조금 짧아서 꽤 읽기 쉽습니다. 아래쪽 레벨 목록 만 신경 쓰면 중첩 된 목록 구조를 하나의 반복 가능한 목록으로 축소하는 기능이 있다면 (기본적으로 모든 chain과 목록 포함이 수행하는 경우), 더 읽기 쉬운 IMO가됩니다. 단지 평평한 구조를 통해 그 반복 단일 목록의 이해를 가질 수있다.

from itertools import chain 

num = 1 
biglist = [[[1, 2, 3], [4, 5, 6, 7]], [[3, 7, 5], [1, 2, 4, 6]]] 
been_with = set(chain(*[x for x in chain(*biglist) if num in x])) - {num} 
+0

정확히 내가 찾던 답변 유형입니다. 정말 고맙습니다! –

4
>>> set(integer for medList in bigList for smallList in medList for integer in smallList if 1 in smallList) 
{1, 2, 3, 4, 6} 

당신은 모든 목록을 통해 루프 세트의 이해를 사용하고 for 루프 코드에서와 같은 순서에 있는지 1. 공지 사항이 포함 된 목록의 요소를 선택할 수 있습니다, 그들은 단지입니다 모두 한 줄에.

>>> set(integer for medList in bigList for smallList in medList for integer in smallList if 1 in smallList and integer != 1) 
{2, 3, 4, 6} 

그런 다음 결과에서 1을 제외하고 싶습니다.

>>> list(set(integer for medList in bigList for smallList in medList for integer in smallList if 1 in smallList and integer != 1)) 
[2, 3, 4, 6] 

결과를 목록으로 원하면 마지막으로 변환하십시오. 집합으로 작업하고 마지막 목록으로 전환하는 것은 중간 결과를 목록으로 저장하는 것보다 효율적입니다.

그런데 숫자가 순서대로 나와 있지만 그럴 수는 없습니다. 세트는 순서가 지정되지 않으므로 정렬되는 것은 우연 일뿐입니다. 순서대로 사용하려면 sorted()에 전화를 추가하십시오.

+0

감사! 이것은 내 방식보다 멋지게 보입니다. –

관련 문제