2011-12-16 10 views
6

folks,sửa đổi phần tử danh sách có hiểu danh sách trong python

Tôi muốn sửa đổi phần tử danh sách có hiểu danh sách. Ví dụ: nếu phần tử là số âm, hãy thêm 4 vào phần tử đó.

Như vậy danh sách

a = [1, -2 , 2] 

sẽ được chuyển đổi sang

a = [1, 2, 2] 

Các mã sau đây làm việc, nhưng tôi đang tự hỏi nếu có một cách tốt hơn để làm điều đó?

Cảm ơn.

for i in range(len(a)): 
    if a[i]<0: 
     a[i] += 4 

Trả lời

11
a = [b + 4 if b < 0 else b for b in a] 
+2

nếu danh sách là rất lớn, cách này có gây ra vấn đề về bộ nhớ không? – nos

+0

Tôi không biết. Tôi đoán rằng điều này tạo ra một danh sách mới mà phải được lưu trữ ở đâu đó trước khi nó được sao chép sang một, vì vậy có lẽ. – BenH

+2

Trừ khi bạn biết rằng tập dữ liệu sẽ được * lớn *, tôi sẽ không lo lắng quá nhiều về nó ... Ngoài ra, biểu thức máy phát điện có thể đi một chặng đường dài để giải quyết các vấn đề như vậy (không phải trong trường hợp này). –

1

Tại sao thay đổi, khi bạn chỉ có thể trả lại danh sách mới giống như bạn muốn?

[4 + x if x < 0 else x for x in [1, -2, 2]] 
3

Phiên bản này là cũ, nó sẽ làm việc trên Python 2,4

>>> [x < 0 and x + 4 or x for x in [1, -2, 2]] 
0: [1, 2, 2] 

Đối với các phiên bản mới hơn của Python sử dụng conditional expressions như trong A-đam Wagner hoặc Bệnh trả lời

2

Hãy thử điều này:

b = [x + 4 if x < 0 else x for x in a] 

Hoặc nếu bạn thích map hơn một hiểu danh sách:

b = map(lambda x: x + 4 if x < 0 else x, a) 
6

Nếu bạn muốn thay đổi danh sách tại chỗ, điều này gần như là cách tốt nhất. Danh sách hiểu sẽ tạo ra một danh sách mới. Bạn cũng có thể sử dụng enumerate và việc chuyển nhượng phải được thực hiện cho a[i]:

for i, x in enumerate(a): 
    if x < 0: 
    a[i] = x + 4