Więc moim problemem jest to, że mam ładowarkę, która ma do tej pory procent pobranego pliku. A czasami procent robi się w górę o jeden lub kilka razy idzie o 4 lub 5 itd. Więc powiedzmy, że moje pliki pobierania poszło w ten sposób:

0 % done
1 % done
2 % done
2 % done
2 % done
3 % done
3 % done
3 % done
3 % done
3 % done
4 % done
5 % done
6 % done
7 % done
7 % done
8 % done
9 % done
10 % done
10 % done
11 % done
12 % done
12 % done
12 % done
13 % done
14 % done
14 % done
15 % done
16 % done
17 % done
17 % done
17 % done
17 % done
17 % done
18 % done
19 % done
20 % done
20 % done
20 % done
20 % done
21 % done
22 % done
23 % done
24 % done
25 % done
26 % done
26 % done
27 % done
28 % done
28 % done
29 % done
30 % done
30 % done
31 % done
32 % done
33 % done
33 % done
33 % done
33 % done
33 % done
34 % done
35 % done
36 % done
36 % done
37 % done
37 % done
38 % done
38 % done
38 % done
39 % done
40 % done
40 % done
40 % done
41 % done
41 % done
41 % done
42 % done
42 % done
43 % done
43 % done
44 % done
44 % done
45 % done
45 % done
46 % done
46 % done
47 % done
47 % done
47 % done
47 % done
47 % done
48 % done
48 % done
49 % done
50 % done
50 % done
50 % done
51 % done
51 % done
51 % done
52 % done
52 % done
53 % done
54 % done
54 % done
54 % done
54 % done
54 % done
54 % done
54 % done
54 % done
55 % done
55 % done
55 % done
55 % done
56 % done
56 % done
56 % done
56 % done
56 % done
56 % done
57 % done
58 % done
59 % done
60 % done
60 % done
61 % done
61 % done
62 % done
62 % done
63 % done
64 % done
65 % done
65 % done
66 % done
66 % done
67 % done
67 % done
67 % done
68 % done
68 % done
69 % done
69 % done
70 % done
70 % done
71 % done
72 % done
73 % done
74 % done
74 % done
75 % done
76 % done
77 % done
78 % done
79 % done
79 % done
80 % done
80 % done
81 % done
81 % done
81 % done
82 % done
83 % done
84 % done
85 % done
85 % done
85 % done
85 % done
86 % done
87 % done
87 % done
87 % done
87 % done
87 % done
87 % done
88 % done
89 % done
89 % done
89 % done
90 % done
90 % done
90 % done
91 % done
91 % done
92 % done
93 % done
94 % done
94 % done
95 % done
95 % done
96 % done
97 % done
98 % done
99 % done
99 % done
99 % done
100 % done

Chciałbym, żeby liczba wzrosła ... Więc jeśli to było:

0 % done
1 % done
2 % done
2 % done
2 % done
3 % done
3 % done
3 % done
3 % done
3 % done
4 % done
5 % done

Rezultatem byłoby coś takiego:

1
1
0
0
0
1
0
0
0
0
1
1
1

Wiem, że to bardzo proste, do tej pory próbowałem czegoś takiego:

import random

a=0
z=0
c=0
while a!=100:
    b=random.randint(1,2)
    z+=a
    if b==1:

        a+=1
    z-=a
    print a
    c+=a
    final=c-a
    print final

Jestem prawie pozytywny, że robię to bardziej skomplikowane, to musi być.

-1
P'sao 8 październik 2011, 23:47

3 odpowiedzi

Najlepsza odpowiedź

Podane x jest listą procentów (zakończenia do pobrania):

x = [ 0, 1, 2, 2, 2, 3, 3 ]

Następnie użyj "skończonych różnic", aby uzyskać zmianę:

delta_x = [ x[i+1] - x[i] for i in xrange(0, len(x)-1) ]

Napisałem to jako zrozumienie listy, ale możesz również zrobić z pętlą.

2
user 8 październik 2011, 19:51

Moja wersja:

>>> s = """
... 1
... 2
... 3
... 3
... 3
... 4
... 4
... 5
... 6
... 7
... 7
... 7
... 7
... 8
... """
>>> percents = map(int, filter(bool, s.splitlines()))
>>> percents
[1, 2, 3, 3, 3, 4, 4, 5, 6, 7, 7, 7, 7, 8]
>>> map(lambda (a, b): b - a, zip(percents[:-1], percents[1:]))
[1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1]
>>>
0
dmedvinsky 8 październik 2011, 19:58

Napiszę go za pomocą {x0}} moduł. Główną różnicą w ramach wymiarów i innych podejść w innych odpowiedziach jest to, że nie musimy obliczyć pozycji elementów, do których powinniśmy iterować (nie ma potrzeby korzystania z plasterków). Cała ta logika jest pokryta iteratorzy, które po prostu podniesie StopIteration w razie potrzeby.

from itertools import tee, izip

current_iter, previous_iter = tee(iter(L))
next(current_iter,None)

for current,previous in izip(current_iter, previous_iter):
    print current-previous

iter(L) tworzy iterator list L.

{x0}} tworzy 2 ieratory iter(L), które zwróć te same wartości.

next(current_iter,None) Zaliczki current_iter o 1 pozycję. Również, jeśli L ma 1 lub 0 wartości, nie zostanie podniesiony, nie zostanie podniesiony, a None zostanie zwrócony (aby osiągnąć takie zachowanie, których używamy None jako drugiego argumentu {{} Funkcja X5}}. Nie jest to problem, że sprawiamy, że kod połknie wyjątek Stop iteration, ponieważ zostanie ponownie podniesiony w następnym użytkowaniu, jeśli ten Iterator (i faktycznie zostanie złapany przez for pętla Po prostu przestań iterować).

izip jest używany do awansowania przez iteratorów {{x1 }} i previous_iter jednocześnie.

Otóż to. Niezbyt skomplikowany.

Możliwe jest również, aby uzyskać generator:

from itertools import tee, izip

def Gen(L):
    current_iter, previous_iter = tee(iter(L))
    next(current_iter,None)

    for current,previous in izip(current_iter, previous_iter):
        yield current-previous

A następnie można użyć generatora:

it1 = Gen(L)
for value in it1:
    print value
0
ovgolovin 8 październik 2011, 21:29