2013-08-01 5 views
11

Мне нужно отсканировать список в 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

Я запутался ... Вы печатаете список, начиная с 1,3,4,5,6,7 и 8, затем начиная с 2, 4, 5, 6, 7, 8, затем 3, 5, 7 ... Я не вижу шаблон, вы можете сделать его явным? – Jblasco

+0

Я просто хотел бы добавить, что было бы лучше сделать 'с open (sys.argv [1]," r ") как fo: # делать вещи с fo', потому что таким образом файл автоматически закрывается, даже если при работе с ним возникает ошибка. Просто хорошая практика. – rlms

ответ

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 заявление при работе с файлами:

with open(sys.argv[1], 'r') as fo: 
    L = fo.readlines() 
+0

Очень приятно, но это то, что пользователь хочет? См. Мой комментарий выше. – Jblasco

+2

@Jblasco Кажется, что он идентичен выходу, который он предоставил в своем вопросе. – TerryA

+0

Теперь, вы правы. Он был отредактирован между ними. – Jblasco

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, чтобы иметь возможность печатать произвольные числа, мы должны предварительно вычислить позиции элементов в строке):

Вот быстрый профиль выполнения (я создал функцию 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)

Это не то, что я думаю, что оригинал вопрос выглядит как критически важная задача, но я думаю, было бы хорошо, если бы люди увидели, почему алгоритм предоставлен, возможно, медленнее, чем они ожидают.

+1

Это улучшенная производительность, но значительно менее надежная, как написано. Если длина чисел не всегда 1, она не даст ожидаемых результатов. – DSM

+0

@DSM, очень хороший момент, пропустил это, я проверю его –

+0

@DSM изменил ответ с предварительно вычисленными позициями элементов –

Смежные вопросы