2013-08-01 31 views
11

Tôi cần quét danh sách bằng Python. Tôi có thể tải nó từ tập tin và thực hiện thao tác đơn giản, nhưng tôi đã cố gắng để làm như sau:Quét danh sách

L = [1,2,3,4,5,6,7,8] 

Bắt đầu từ phần tử đầu tiên tôi muốn cho kết quả sau:

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 

và vân vân.

Tôi đã cố gắng một cái gì đó như thế này:

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

Ông có thể giúp tôi?

+0

Tôi đang bối rối ... Bạn đang in danh sách bắt đầu từ 1,3,4,5,6,7 và 8, sau đó bắt đầu bằng 2, 4, 5, 6, 7, 8, rồi 3, 5, 7 ... Tôi không thấy mô hình, bạn có thể làm cho nó rõ ràng? – Jblasco

+0

Tôi chỉ muốn thêm rằng nó sẽ tốt hơn để làm 'với mở (sys.argv [1]," r ") như fo: # làm công cụ với fo' bởi vì cách này tập tin được tự động đóng ngay cả khi một lỗi xảy ra khi giao dịch với nó. Thực hành tốt. – rlms

Trả lời

13

Bằng cách nào? Tốt đẹp và đơn giản để đọc:

>>> 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 nghĩa trong khi danh sách temp là không có sản phẩm nào. Chúng ta phải gọi map(str, L[j:]) đây vì danh sách này là đầy đủ các số nguyên (và do đó phương pháp str.join sẽ không hoạt động)


Chỉ cần một lưu ý, đó là hơn pythonic sử dụng một tuyên bố with khi làm việc với các tập tin:

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

Rất đẹp, nhưng đó là những gì người dùng muốn? Xem bình luận của tôi ở trên. – Jblasco

+2

@Jblasco Dường như nó giống với đầu ra mà anh ta cung cấp trong câu hỏi của mình – TerryA

+0

Bây giờ, bạn đã đúng. Nó được chỉnh sửa ở giữa. – Jblasco

4

Trong khi câu trả lời của Haidro tạo ra kết quả mong muốn, tôi nên nói rằng đây là thuật toán khá kém hiệu quả để thực hiện tác vụ được cung cấp.

phân tích nhanh chóng:

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

nó quá nhiều công việc cho một nhiệm vụ đơn giản như vậy. Tôi nghĩ rằng nó có thể được thực hiện đơn giản hơn và nhanh hơn, nối chuỗi chỉ một lần và sau đó in các bản chất (như DCM đã đề cập trong các nhận xét, để có thể in các số tùy ý, chúng ta nên tính toán trước vị trí của các phần tử trong chuỗi):

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

Đây là hồ sơ nhanh về thời gian thực hiện (Tôi đã tạo chức năng worker1 với mã Haidro và worker2 cùng với tôi). Bạn có thể thấy cách phát triển thời gian thực hiện khi bạn tăng chiều dài đầu vào 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 

Nó phát triển như 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 

Cái này phát triển như O(N^2)

Nó không phải là tôi nghĩ rằng ban đầu câu hỏi có vẻ như nhiệm vụ quan trọng về hiệu suất, nhưng tôi nghĩ nó sẽ rất tuyệt nếu mọi người thấy lý do tại sao thuật toán được cung cấp có thể chậm hơn mong đợi của họ.

+1

Điều này có hiệu suất tốt hơn nhưng kém rõ ràng hơn đáng kể khi được viết. Nếu độ dài của các số không phải lúc nào cũng là 1, nó sẽ không cho kết quả mong đợi. – DSM

+0

@ DSM, điểm rất tốt, bỏ qua điều đó, tôi sẽ kiểm tra nó –

+0

@DSM đã thay đổi câu trả lời với các vị trí được xác định trước của các phần tử –

Các vấn đề liên quan