扫描列表

时间:2013-08-01 09:43:01

标签: python

我需要在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])

你能帮帮我吗?

2 个答案:

答案 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}}

一样增长

并不是说我认为原始问题看起来像是性能关键任务,但我认为如果人们看到为什么提供的算法可能比他们期望的慢,那将会很好。