2011-10-08 132 views
0

所以我的问题是,我有一个下载,目前已下载的文件的百分比。 有时%的doesent上由一个或某些时候,它由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 

我知道这是很简单的,到目前为止香港专业教育学院尝试了一些薄g像:

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 

即时通讯几乎肯定,即时通讯使这更复杂,然后它必须是。

+0

步骤一:使用更好的变量名。 'a','b','c'和'z'都不是很好的变量名。这使得它比它要复杂得多。第二步:按照[PEP 8](http://www.python.org/dev/peps/pep-0008/)制作'a = 0'' a = 0','a!= 100'' a! = 100'等;这也会使你的代码更具可读性。 –

+0

变量'z'目前没有任何用途。 –

回答

2

鉴于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”。 – user

0

我的版本:

>>> 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

使用列表解析。地图+过滤器灼伤我的眼睛 – JBernardo

+0

哦,对不起你的眼睛,并不意味着做到没有伤害,家伙。不过,我建议你在阅读功能代码之前先佩戴某种代码护目镜。 – dmedvinsky

+0

@dmedvinsky:关键是你应该在Python中工作时使用Python风格。为什么不使用'.split()'而不是使用'splitlines()'来为自己做更多的工作? 'percents = [int(n)for s.split()]','[b - a for a,b in zip(百分数[: - 1],百分数[1:]]' –

0

我会使用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_iterprevious_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