我需要在Python中扫描列表。我可以从文件中加载它并进行简单的操作,但我试图执行以下操作:
L = [1,2,3,4,5,6,7,8]
从第一个元素开始,我想产生以下输出:
1
2,3,4,5,6,7,8
3,4,5,6,7,8
4,5,6,7,8
5,6,7,8
6,7,8
7,8
8
2
3,4,5,6,7,8
4,5,6,7,8
5,6,7,8
6,7,8
7,8
8
3
4,5,6,7,8
5,6,7,8
6,7,8
7,8
8
4
5,6,7,8
6,7,8
7,8
8
等等。
我正在尝试这样的事情:
fo = open(sys.argv[1], 'r')
L = fo.readlines()
for i in range(len(L)):
print str(L[i])
for j in range(len(L)-1-i):
print '...' + str(L[i+j+1])
你能帮帮我吗?
答案 0 :(得分:13)
这是怎么回事?好看又简单:
>>> for i, j in enumerate(L):
... print L[i]
... temp = map(str, L[j:])
... while temp:
... print ' ', ','.join(temp)
... temp = temp[1:]
...
1
2,3,4,5,6,7,8
3,4,5,6,7,8
4,5,6,7,8
5,6,7,8
6,7,8
7,8
8
2
3,4,5,6,7,8
4,5,6,7,8
5,6,7,8
6,7,8
7,8
8
3
4,5,6,7,8
5,6,7,8
6,7,8
7,8
8
...
while temp
表示列表temp
不为空。我们必须在这里调用map(str, L[j:])
因为列表中有整数(因此str.join
方法不起作用)
另外请注意,在处理文件时使用with
语句更为pythonic:
with open(sys.argv[1], 'r') as fo:
L = fo.readlines()
答案 1 :(得分:4)
虽然Haidro回答产生了所需的输出,但我应该说这是完成任务所提供的非常低效的算法。
快速分析:
for i, j in enumerate(L): # loop number 1, for i from 1 to N
print L[i]
temp = map(str, L[j:])
while temp: # nested loop number 2, for j from i to N
print ' ', ','.join(temp) # nested loop number 3, for k from j to N
temp = temp[1:]
对于这么简单的任务来说,这太过分了。我认为它可以更加简单和快速,只需连接一次字符串然后打印子字符串(如评论中提到的DCM,能够打印任意数字,我们应该预先计算字符串中元素的位置):
s = ",".join(map(str, l)) # creating string
p = [len(str(x)) + 1 for x in l] # calculating length of each element
p = [sum(p[:i]) for i in range(len(p))] # calculating positions with rolling total
for i in range(len(l)): # loop number 1
print l[i]
for j in range(i + 1, len(l)): # nested loop number 2
print ' ', s[p[j]:]
以下是执行时间的快速概况(我使用Haidro代码创建函数worker1
,使用我的worker2
创建函数>>> from timeit import timeit
>>> timeit("worker1(l)", "from testSO import worker1, l", number=10)
0.0016222212978796024
>>> timeit("worker1(l*10)", "from testSO import worker1, l", number=10)
0.33153371422580324
>>> timeit("worker1(l*100)", "from testSO import worker1, l", number=10)
163.25908817145972
)。当您增加输入长度N时,您可以看到执行时间的增长情况:
O(N^3)
它像>>> timeit("worker2(l)", "from testSO import worker2, l", number=10)
0.0006974355000011201
>>> timeit("worker2(l*10)", "from testSO import worker2, l", number=10)
0.03448374103493279
>>> timeit("worker2(l*100)", "from testSO import worker2, l", number=10)
4.446190059150922
O(N^2)
这个像{{1}}
一样增长并不是说我认为原始问题看起来像是性能关键任务,但我认为如果人们看到为什么提供的算法可能比他们期望的慢,那将会很好。