Tôi có hàm sumranges(), tổng hợp tất cả các dãy số liên tiếp được tìm thấy trong một bộ dữ liệu. Để minh họa:Tổng các dãy liên tiếp bằng Python
def sumranges(nums):
return sum([sum([1 for j in range(len(nums[i])) if
nums[i][j] == 0 or
nums[i][j - 1] + 1 != nums[i][j]]) for
i in range(len(nums))])
>>> nums = ((1, 2, 3, 4), (1, 5, 6), (19, 20, 24, 29, 400))
>>> print sumranges(nums)
7
Như bạn có thể thấy, nó trả về số dãy chữ số liên tiếp trong tuple, đó là: len ((1, 2, 3, 4), (1), (5, 6), (19, 20), (24), (29), (400)) = 7. Các bộ dữ liệu luôn được đặt hàng.
Vấn đề của tôi là tổng hợp của tôi() là khủng khiếp. Tôi ghét nhìn nó. Tôi hiện đang chỉ lặp qua bộ tuple và mỗi subtuple, gán 1 nếu số đó không phải là (1 + số trước đó), và tổng cộng tổng số. Tôi cảm thấy như tôi đang thiếu một cách dễ dàng hơn nhiều để hoàn thành mục tiêu đã nêu của tôi. Có ai biết một cách sâu sắc hơn để làm điều này?
Chỉnh sửa: Tôi đã đánh giá tất cả các câu trả lời được đưa ra từ trước đến nay. Nhờ tất cả các bạn cho câu trả lời của bạn.
Mã điểm chuẩn như sau, sử dụng một kích thước mẫu 100K:
from time import time
from random import randrange
nums = [sorted(list(set(randrange(1, 10) for i in range(10)))) for
j in range(100000)]
for func in sumranges, alex, matt, redglyph, ephemient, ferdinand:
start = time()
result = func(nums)
end = time()
print ', '.join([func.__name__, str(result), str(end - start) + ' s'])
Kết quả như sau. Câu trả lời thực tế chứng minh là xác minh rằng tất cả các chức năng trả lại câu trả lời đúng:
sumranges, 250281, 0.54171204567 s
alex, 250281, 0.531121015549 s
matt, 250281, 0.843333005905 s
redglyph, 250281, 0.366822004318 s
ephemient, 250281, 0.805964946747 s
ferdinand, 250281, 0.405596971512 s
RedGlyph không cạnh bật về tốc độ, nhưng câu trả lời đơn giản nhất có lẽ là Ferdinand, và có lẽ chiến thắng đối với hầu hết pythonic.
Đó là thực sự trơn. –
Ah, tôi đã bỏ lỡ "tuples luôn được sắp xếp" bit trong câu hỏi - rằng bit _does_ làm cho câu trả lời này thích hợp hơn (tôi sẽ làm việc cho các bộ dữ liệu tùy ý, chứ không phải chỉ là những thứ đặt hàng, nhưng, có một mức giá nhỏ để trả tiền cho điều đó tổng quát). –