#python
#python
Вопрос:
Итак, моя проблема в том, что у меня есть загрузчик, в котором указан процент загруженного файла. И иногда процент не увеличивается на один или несколько раз, он увеличивается на 4 или 5 и т.д. итак, скажем, что процент загрузки моих файлов был таким:
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
я бы хотел, чтобы число, на которое вырос процент… так что, если бы это было:
0 % done
1 % done
2 % done
2 % done
2 % done
3 % done
3 % done
3 % done
3 % done
3 % done
4 % done
5 % done
результатом будет что-то вроде:
1
1
0
0
0
1
0
0
0
0
1
1
1
я знаю, что это очень просто, пока я пробовал что-то вроде:
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
я почти уверен, что я делаю это более сложным, чем должно быть.
Комментарии:
1.Шаг первый: используйте более приятные имена переменных.
a
,b
,c
иz
не являются хорошими именами переменных. Это делает его намного сложнее, чем должно быть. Шаг второй: следуйте PEP 8 и сделайтеa=0
a = 0
,a!=100
a != 100
, и т.д.; Это также сделает ваш код намного более читабельным.2. Переменная
z
в настоящее время не служит никакой цели.
Ответ №1:
Приведен x
список процентов (завершения для вашей загрузки):
x = [ 0, 1, 2, 2, 2, 3, 3 ]
Затем используйте «конечное различие», чтобы получить изменение:
delta_x = [ x[i 1] - x[i] for i in xrange(0, len(x)-1) ]
Я написал его как список для понимания, но вы также можете сделать это с помощью цикла.
Комментарии:
1. Если вы получаете эти значения «на лету», вы просто печатаете
current - previous
, а затем устанавливаетеprevious = current
.
Ответ №2:
Моя версия:
>>> 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]
>>>
Комментарии:
1. Используйте понимание списка. Карта фильтр сжигают мои глаза
2. О, извини за твои глаза, не хотел причинить вреда, парень. Я бы порекомендовал вам надеть какие-нибудь кодовые очки, прежде чем читать функциональный код.
3. @dmedvinsky: дело в том, что вы должны использовать стиль Python для чего угодно при работе на Python. И почему бы просто не сделать
.split()
вместо того, чтобы делать больше работы для себя, используяsplitlines()
?percents = [int(n) for n in s.split()]
,[b - a for a, b in zip(percents[:-1], percents[1:]]
Ответ №3:
Я бы написал его с помощью itertools
модуля. Основное отличие от понимания списков и других подходов в других ответах заключается в том, что нам не нужно вычислять позиции элементов, к которым мы должны выполнить итерацию (нет необходимости использовать срезы). Вся эта логика покрыта итераторами, которые будут просто подниматься StopIteration
при необходимости.
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)
создает итератор list L
.
tee
создает 2 итератора iter(L)
, которые возвращают одинаковые значения.
next(current_iter,None)
продвигает current_iter
на 1 позицию. Кроме того, если L
имеет значения 1 или 0, исключение не будет вызвано и None
будет возвращено (для достижения такого поведения мы используем None
в качестве второго аргумента next
функции. Это не проблема, что мы заставляем код проглатывать Stop iteration
исключение, поскольку оно будет снова вызвано при следующем использовании, если этот итератор (и фактически будет перехвачен for
циклом, который просто прекратит итерацию).
izip
используется для продвижения по итераторам current_iter
и previous_iter
одновременно.
Вот и все. Не очень сложный.
Из него также можно создать генератор:
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
И затем можно использовать генератор:
it1 = Gen(L)
for value in it1:
print value