Tôi đã tự hỏi nếu có một cách để chạy bản đồ trên một cái gì đó. Cách bản đồ hoạt động là phải mất một iterable và áp dụng một chức năng cho mỗi mục trong đó iterable sản xuất một danh sách. Có cách nào để bản đồ sửa đổi đối tượng có thể lặp lại không?Python: bản đồ tại chỗ
Trả lời
Bạn có thể sử dụng một lambda (hoặc một def) hoặc danh sách hiểu biết tốt hơn (nếu nó là đủ):
[ do_things_on_iterable for item in iterable ]
Dù sao bạn có thể muốn được rõ ràng hơn với một vòng lặp for nếu mọi chuyện trở nên quá nhiều phức tạp.
Ví dụ bạn có thể làm một cái gì đó như thế nào, đó nhưng IMHO nó xấu xí:
[ mylist.__setitem__(i,thing) for i,thing in enumerate(mylist) ]
Chỉ cần viết mã rõ ràng để làm điều đó.
for i, item in enumerate(sequence):
sequence[i] = f(item)
Tôi đã thử rằng ... kỳ quặc nó chậm hơn so với danh sách hiểu. Lý do tôi hỏi câu hỏi này là bởi vì tôi đã tìm ra bản đồ sẽ nhanh hơn cách đọc danh sách, và tôi cũng không thấy điểm trong việc tạo danh sách mới, nhưng cho đến nay việc hiểu danh sách là chiến thắng. – johannix
Danh sách hiểu == đường cú pháp cho bản đồ – carl
Làm cách nào để bạn giải thích hiệu suất đạt được sau đó? bản đồ chậm gấp hai lần. – johannix
Nó đủ đơn giản để viết:
def inmap(f, x):
for i, v in enumerate(x):
x[i] = f(v)
a = range(10)
inmap(lambda x: x**2, a)
print a
Một phân lát thường là ok nếu bạn cần phải sửa đổi một danh sách ở vị trí
mylist[:] = map(func, mylist)
Bạn chỉ có hiệu quả có thể làm điều này trong Python với một chuỗi có thể thay đổi (tức là một danh sách), không phải là một biến lặp tùy ý. – jemfinch
Phải, tôi đang làm việc với một danh sách. – johannix