두 개의 변수가 있는 "루프"?
두 변수를 동일한 변수에 포함하려면 어떻게 해야 합니까?for
루프?
t1 = [a list of integers, strings and lists]
t2 = [another list of integers, strings and lists]
def f(t): #a function that will read lists "t1" and "t2" and return all elements that are identical
for i in range(len(t1)) and for j in range(len(t2)):
...
루프에 내포된 효과를 사용하려면 다음을 사용합니다.
import itertools
for i, j in itertools.product(range(x), range(y)):
# Stuff...
동시에 루프하려면 다음을 사용합니다.
for i, j in zip(range(x), range(y)):
# Stuff...
참고: 만약x
그리고.y
길이가 같지 않습니다.zip
가장 짧은 목록으로 잘립니다.@abarnert가 지적했듯이, 가장 짧은 목록으로 자르지 않으려면 다음을 사용할 수 있습니다.itertools.zip_longest
.
갱신하다
"목록 "t1"과 "t2"를 읽고 동일한 모든 요소를 반환하는 함수"에 대한 요청을 바탕으로 OP가 원하지 않는다고 생각합니다.zip
또는 product
그들이 원하는 것 같습니다.set
:
def equal_elements(t1, t2):
return list(set(t1).intersection(set(t2)))
# You could also do
# return list(set(t1) & set(t2))
그intersection
의 방법set
모든 공통 요소와 다른 집합을 반환합니다(목록에 다른 요소가 포함된 경우 참고).list
s, 내부를 변환하는 것이 좋습니다.list
스토tuples
먼저 해시할 수 있도록; 그렇지 않으면 에 대한 요청.set
실패할 것입니다.그list
그런 다음 function은 집합을 목록으로 되돌립니다.
업데이트 2
또는 OP는 목록에서 동일한 위치에 있는 동일한 요소를 원할 수 있습니다.이 경우에는,zip
가장 적합할 것이며, 가장 짧은 목록으로 잘라지는 것이 여러분이 원하는 것입니다(목록 중 하나가 5개의 요소만 있는 경우 인덱스 9에 동일한 요소가 있을 수 없기 때문입니다).원하는 것이 있다면 다음과 같이 하십시오.
def equal_elements(t1, t2):
return [x for x, y in zip(t1, t2) if x == y]
그러면 목록에서 동일한 위치에 있는 요소만 포함된 목록이 반환됩니다.
여기에는 두 가지 가능한 질문이 있습니다. 어떻게 하면 이러한 변수를 동시에 반복할 수 있는지, 아니면 어떻게 하면 변수의 조합을 반복할 수 있는지.
다행히도, 두 가지 모두에 대한 간단한 답이 있습니다.첫 번째 사례, 사용하고자 하는 경우zip
.
x = [1, 2, 3]
y = [4, 5, 6]
for i, j in zip(x, y):
print(str(i) + " / " + str(j))
will 출력
1 / 4
2 / 5
3 / 6
기억하세요, 당신은 어떤 것이든 넣을 수 있습니다.zip
따라서 다음과 같이 쉽게 예를 작성할 수 있습니다.
for i, j in zip(range(x), range(y)):
# do work here.
사실, 방금 그것이 효과가 없을 것이라는 것을 깨달았습니다.더 작은 범위가 소진될 때까지만 반복됩니다.이 경우 루프의 조합을 반복하고 싶은 것처럼 들립니다.
다른 경우에는 중첩 루프만 사용합니다.
for i in x:
for j in y:
print(str(i) + " / " + str(j))
너에게 주는
1 / 4
1 / 5
1 / 6
2 / 4
2 / 5
...
목록 이해로 이 작업을 수행할 수도 있습니다.
[str(i) + " / " + str(j) for i in range(x) for j in range(y)]
루프에 네스트를 사용할 수 없는 이유가 있습니까?
for i in range(x):
for j in range(y):
#code that uses i and j
for (i,j) in [(i,j) for i in range(x) for j in range(y)]
해야 합니다.
범위에 대해 잠금 단계 반복만 수행하는 경우 다음과 같은 여러 가지 방법 중 하나를 사용할 수 있습니다.
for i in range(x):
j = i
…
# or
for i, j in enumerate(range(x)):
…
# or
for i, j in ((i,i) for i in range(x)):
…
위의 모든 것은 다음과 같습니다.for i, j in zip(range(x), range(y))
한다면x <= y
.
중첩 루프를 사용하고 반복 가능한 항목이 두 개뿐인 경우에는 중첩 루프를 사용합니다.
for i in range(x):
for i in range(y):
…
가능한 두 개 에는 반복가항두개경있우는을 합니다.itertools.product
.
마지막으로, 잠금 단계 반복을 원하는 경우 다음과(와)x
그리고 나서 계속.y
당신은 나머지가 무엇인지 결정해야 합니다.x
값은 다음과 같아야 합니다.
for i, j in itertools.zip_longest(range(x), range(y), fillvalue=float('nan')):
…
# or
for i in range(min(x,y)):
j = i
…
for i in range(min(x,y), max(x,y)):
j = float('nan')
…
"파이썬 3."
zip 및 range를 사용하여 루프에 대한 2개의 변수를 추가합니다. 목록을 반환합니다.
참고: 가장 작은 범위가 끝날 때까지만 실행됩니다.
>>>a=[g+h for g,h in zip(range(10), range(10))]
>>>a
>>>[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
사용 사례의 경우 루프를 사용하는 것이 더 쉬울 수 있습니다.
t1 = [137, 42]
t2 = ["Hello", "world"]
i = 0
j = 0
while i < len(t1) and j < len(t2):
print t1[i], t2[j]
i += 1
j += 1
# 137 Hello
# 42 world
주의할 점으로, 이 접근 방식은 가장 짧은 목록의 길이로 잘라집니다.
제 생각에 당신은 중첩된 루프를 찾고 있는 것 같습니다.
예(편집 내용 기준):
t1=[1,2,'Hello',(1,2),999,1.23]
t2=[1,'Hello',(1,2),999]
t3=[]
for it1, e1 in enumerate(t1):
for it2, e2 in enumerate(t2):
if e1==e2:
t3.append((it1,it2,e1))
# t3=[(0, 0, 1), (2, 1, 'Hello'), (3, 2, (1, 2)), (4, 3, 999)]
다음은 하나의 이해로 요약할 수 있습니다.
[(it1,it2,e1) for it1, e1 in enumerate(t1) for it2, e2 in enumerate(t2) if e1==e2]
하지만 공통 요소를 찾으려면 다음과 같이 하면 됩니다.
print set(t1) & set(t2)
# set([(1, 2), 1, 'Hello', 999])
목록에 해시할 수 없는 개체(다른 목록과 마찬가지로 딕트)가 포함된 경우 고정 집합을 사용합니다.
from collections import Iterable
s1=set(frozenset(e1) if isinstance(e1,Iterable) else e1 for e1 in t1)
s2=set(frozenset(e2) if isinstance(e2,Iterable) else e2 for e2 in t2)
print s1 & s2
언급URL : https://stackoverflow.com/questions/18648626/for-loop-with-two-variables
'programing' 카테고리의 다른 글
pthread_return 대 반환 (0) | 2023.06.16 |
---|---|
Firebase 콘솔에서 이벤트 매개 변수를 보는 방법 (0) | 2023.06.16 |
ASP.NET MVC의 SSL 페이지 (0) | 2023.06.16 |
Android getResources().getDrawable()이 더 이상 사용되지 않는 API 22 (0) | 2023.06.16 |
하나의 Postgre에서 여러 WITH 문을 사용하는 방법SQL 쿼리? (0) | 2023.06.16 |