2010-09-23 39 views
10

Có cách nào thành ngữ hơn để tổng hợp độ dài chuỗi bằng Python bằng cách sử dụng vòng lặp không?Python: Tổng chiều dài chuỗi

length = 0 
for string in strings: 
    length += len(string) 

tôi đã cố gắng sum(), nhưng nó chỉ hoạt động cho số nguyên:

>>> sum('abc', 'de') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: sum() can't sum strings [use ''.join(seq) instead] 
+1

Bạn có ý nghĩa gì bởi "nhanh hơn"? Ít đánh máy hoặc thực hiện nhanh hơn? –

+0

@Richard: Xin lỗi, tôi đã suy nghĩ "nhanh hơn" như ít đánh máy hơn, nhưng điều tôi thực sự muốn nói là thành ngữ. – Zaz

+1

Không phải lo lắng. Tôi nghĩ đó là những gì mọi người khác đã tìm ra. Tôi chỉ là một người đi! –

Trả lời

2

Tôi biết đây là một câu hỏi cũ, nhưng tôi không thể không chú ý rằng thông báo lỗi Python yêu cầu bạn cách thực hiện:

TypeError: sum() can't sum strings [use ''.join(seq) instead] 

Vì vậy:

>>> strings = ['abc', 'de'] 
>>> print len(''.join(strings)) 
5 
+0

Có vẻ như lãng phí khi kết nối các chuỗi khi bạn không phải làm, nhưng +1 để thêm một cách khác để giải quyết vấn đề! – Zaz

+0

Tôi không biết - Tôi từ lâu đã ngừng tự hỏi liệu mã có bị lãng phí CPU cho các hệ thống không theo thời gian thực hay không. Nhưng kể từ khi bạn đề cập đến "ít đánh máy" này trông khá chặt chẽ. – Auspex

+1

@Zaz Wasteful?Đây là giải pháp nhanh nhất trong ba giải pháp, nếu mô-đun 'timeit' được tin tưởng. Câu trả lời bạn chấp nhận, 'tổng (len (s) cho s trong chuỗi)', là hơn ba lần như chậm, và cũng gần như hai lần chậm như 'tổng hợp (bản đồ (len, dây))'. (Tốc độ của khóa học không quan trọng nhiều trong Python - nếu bạn muốn tốc độ bạn muốn sử dụng Pypy, như nói đi - nhưng biểu hiện máy phát điện đầy đủ cũng là IMO một chút của một eyesore so với những người khác.) –

28
length = sum(len(s) for s in strings) 
+0

Điều này chắc chắn là một cách thể hiện thành ngữ hơn nhưng tôi không nghĩ nó có tính toán hiệu quả hơn. Tuy nhiên, 1 cho sự sang trọng và Pythonicness! –

+1

Nếu bạn thực sự lo lắng về hiệu suất tính toán, bạn có lẽ không nên sử dụng Python, hoặc nên viết phần tính toán cường độ cao trong C hoặc C++ (hoặc thư viện dệt của SciPy nếu bạn dũng cảm). Tôi thích kiểu này vì nó dễ đọc hơn với các nhà phát triển Python khác. –

+0

Cảm ơn, điều này ngắn hơn và dễ hiểu hơn mã của tôi. – Zaz

2
print(sum(len(mystr) for mystr in strings)) 
13

cách đầu tiên của tôi để làm điều đó sẽ sum(map(len, strings)). Một cách khác là sử dụng biểu thức hiểu danh sách hoặc trình tạo trình phát như các câu trả lời khác đã được đăng.

+0

Câu trả lời hay, nhưng tôi đã chấp nhận câu trả lời của [liori] (http://stackoverflow.com/questions/3780403#3780412) bởi vì tôi thấy nó thành ngữ hơn. – Zaz

+0

@Josh: Hầu hết mọi người thực sự sẽ tìm thấy genexp hơn pythonic. Tôi chỉ muốn thêm điều này cho đầy đủ. – Daenyth

1

Dưới đây là một cách khác bằng cách sử dụng toán tử. Không chắc chắn nếu điều này dễ đọc hơn câu trả lời được chấp nhận.

import operator 

length = reduce(operator.add, map(len, strings)) 

print length 
-1

Chỉ cần thêm vào ...

số Thêm từ một danh sách được lưu trữ như là một chuỗi

nos = [ '1', '14', '34']

length = sum (int (s) cho s trong nos)

3

Con đường ngắn nhất và nhanh nhất là áp dụng một functional programming style với map()sum():

>>> data = ['a', 'bc', 'def', 'ghij'] 
>>> sum(map(len, data)) 
10 

Trong Python 2, sử dụng itertools.imap thay vì đồ cho tốt hơn hiệu suất bộ nhớ:

>>> from itertools import imap 
>>> data = ['a', 'bc', 'def', 'ghij'] 
>>> sum(imap(len, data)) 
10 
Các vấn đề liên quan