2015-05-07 36 views
8

tôi không thể sử dụng itertoolsTiếp tục cho đến khi tất cả các vòng lặp được thực hiện Python

Vì vậy, các mã có vẻ khá đơn giản, nhưng tôi đang gặp rắc rối suy nghĩ của thuật toán để giữ một máy phát điện chạy cho đến khi tất cả các lần lặp đã được xử lý xong.

Ý tưởng của hàm là để mất 2 iterables như các thông số như thế này ...

(['a', 'b', 'c', 'd', 'e'], [1,2,5])

Và những gì nó làm là mang lại những giá trị ...

a, b, b, c, c, c, c, c

Tuy nhiên, trong trường hợp lần lặp thứ hai chạy hết các phần tử đầu tiên, hàm chỉ đơn giản là lặp lại giá trị còn lại một lần ...

Vì vậy, các giá trị còn lại sẽ được lặp như thế này:

d, e

def iteration(letters, numbers): 
    times = 0 
    for x,y in zip(letters, numbers): 
     try: 
      for z in range(y): 
       yield x 
     except: 
      continue 

[print(x) for x in iteration(['a', 'b', 'c', 'd'], [1,2,3])] 

Tôi đang gặp khó khăn bỏ qua StopIteration đầu tiên và tiếp tục hoàn thành.

+0

Vâng đó là nơi tôi đang gặp vấn đề với là tốt. Tôi không biết làm thế nào để có được sự lặp lại để tiếp tục cùng nhau đồng thời để có được 1 giá trị, và b nhận giá trị 2. – FlyingBumble

+0

Điều gì sẽ xảy ra với d và e? –

+0

Khi có thể lặp lại với các con số hết, các vòng lặp còn lại trong lần đầu tiên sẽ chỉ được tạo một lần mỗi lần. – FlyingBumble

Trả lời

18

Sử dụng một giá trị mặc định của 1 cho tới vì vậy bạn in các chữ cái ít nhất một lần:

def iteration(letters, numbers): 
    # create iterator from numbers 
    it = iter(numbers) 
    # get every letter 
    for x in letters: 
     # either print in range passed or default range of 1 
     for z in range(next(it, 1)): 
      yield x 

Output:

In [60]: for s in iteration(['a', 'b', 'c', 'd', 'e'], [1,2,5]): 
    ....:  print(s) 
    ....:  
a 
b 
b 
c 
c 
c 
c 
c 
d 
e 
+0

Cảm ơn điều này đã giúp một bó, và nó đã được dễ dàng để hiểu nơi tôi đã đi sai. Tôi không biết rằng bạn có thể gán một giá trị mặc định cho một iterable nếu nó không thành công. – FlyingBumble

+0

@ FlyingBumble, không có prob, đó là một vấn đề thú vị. Có giá trị thứ hai để tiếp theo là một giá trị mặc định mà sẽ tránh một StopIteration và cũng cho phép chúng ta xem mỗi chuỗi ít nhất một lần. –

2

Đọc tài liệu về zip(). Nó nói: "zip() chỉ nên được sử dụng với đầu vào chiều dài không bằng nhau khi bạn không quan tâm đến dấu vết, giá trị chưa được so khớp từ các vòng lặp dài hơn. Nếu những giá trị này quan trọng, hãy sử dụng itertools.zip_longest() thay thế."

Các vấn đề liên quan