12

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

你可以帮帮我吗 ?

4

2 回答 2

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()
于 2013-08-01T09:47:43.063 回答
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]:]

这是执行时间的简要介绍(我worker1用 Haidro 代码和worker2我的代码创建了函数)。当您增加输入长度 N 时,您可以看到执行时间如何增长:

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

它长得像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)

这并不是说我认为最初的问题看起来像性能关键任务,但我认为如果人们看到为什么提供的算法可能比他们预期的要慢,那就太好了。

于 2013-08-04T08:41:29.950 回答