01/10/2018, 11:53

Nhờ giải thích giúp đoạn Code về Reduce

Em có đoạn Code dưới đây dùng để xóa bớt các giá trị trùng nhau trong 1 list:

l = [5, 6, 6, 1, 1, 2, 2, 3, 4]
s= reduce(lambda r, v: v in r and r or r + [v], l, [])
print s

KQ: [5, 6, 1, 2, 3, 4]

Tuy nhiên em chưa hiểu các biểu thức bên trong hàm reduce, nhờ các anh chị giải thích giúp e vs ạ.
Em có tìm hiểu về hàm reduce rồi nhưng cú pháp trong trường hợp này lạ quá, em chưa hiểu được.
Cám ơn mọi người ạ

Nguyễn Duy Hùng viết 14:09 ngày 01/10/2018

cái đoạn r in v and r or r + [v] nó giống toán tử ba ngôi vậy đó nó kiểm tra xem phần tử v có trong list r chưa nếu có thì tiếp tục để nguyên còn ko thì add v vô.

Henry viết 14:03 ngày 01/10/2018

Trước tiên, bạn cần hiểu dòng lambda. Hoàn toàn chính xác như anh Hùng đề cập, để mình cho bạn vài ví dụ

>>> 5 in [] and [] or [] + [5] # 5 có trong [] hay không? nếu có thì trả về [] + [5] không thì []
[5]
>>> 5 in [3] and [3] or [3] + [5] # 5 có trong [3] hay không? nếu có thì trả về [3] + [5] không thì [3]
[3, 5]
>>> 5 in [3, 5] and [3, 5] or [3, 5] + [5] # 5 có trong [3, 5] hay không? nếu có thì trả về [3, 5] + [5] không thì [3, 5]
[3, 5]

Có thể xem công thức tổng quát của nó là

Điều kiện and Giá trị trả về nếu False or Giá trị trả về  nếu True

Tiếp đến là cái hàm reduce. Ở đây mình sẽ nói trường hợp 3 arguments. Còn bạn muốn đủ thì lên mạng đọc, có docs.
Hàm reduce sẽ như sau

def reduce(function, iterable, initializer):
    for element in iterable:
        initializer = function(initializer, element)
    return value

Bạn cố suy ngẫm hàm trên nhé. Nếu xong rồi, hãy kéo xuống!


Hiểu hàm reduce ở trên rồi. Đây là cách viết rõ ràng của dòng reduce của bạn

def lambda(r, v):
    if v in r:
        return r
    else:
        return r + [v]

l = [5, 6, 6, 1, 1, 2, 2, 3, 4]
p = []
for element in l:
    p = lambda(p, element)
print(p)
giang viết 13:53 ngày 01/10/2018

>>> 5 in [] and [] or [] + [5] # 5 có trong [] hay không? nếu có thì trả về [] + [5] không thì []
[5]
>>> 5 in [3] and [3] or [3] + [5] # 5 có trong [3] hay không? nếu có thì trả về [3] + [5] không thì [3]
[3, 5]
>>> 5 in [3, 5] and [3, 5] or [3, 5] + [5] # 5 có trong [3, 5] hay không? nếu có thì trả về [3, 5] + [5] không thì [3, 5]
[3, 5]

Hic …. hình như đoạn comment anh viết bị lộn phải không. Nếu chưa có thì Ad vô còn có rồi thì giữ nguyên.

Bài liên quan
0