List comprehension is a useful programming syle. Here notes how it can be done in Python language.

ลิสต์(list) เป็น abstract data type (โครงสร้างข้อมูล?) ชนิดหนึ่งในภาษาคอมพิวเตอร์ระดับสูง (higher-level programming language)  เราอาจจะมองง่ายๆว่า list เป็นรายชื่อของสิ่งต่างๆเหมือนในภาษาธรรมชาติ(natural language) เช่น รายชื่อนักกีฬาในทีมฟุตบอลแห่งหนึ่ง  ในภาษาคอมพิวเตอร์เราสามารถใช้ list ในการรวบรวมตัวแปร(variable) หรือข้อมูล(data) หลายชิ้นเข้าไว้ด้วยกัน 

ในภาษาประเภท procedural เช่น C  เราอาจจะใช้ อาเรย์(array) โดยตรงแทน list  แต่จะเห็นว่า code จะยุ่งเหยิงเพราะต้องใช้ Pointer ช่วย [link: c pointer?]

ในขณะที่ภาษาประเภท object-oriented เช่น Java ใช้ Interface กำหนดคุณลักษณะของ list แล้วค่อย implement จริงใน ArrayList, LinkedList, Vector โดยจะใช้ method เช่น add, remove, get, iterator ในการใช้งานจริง

ถ้าเคยศึกษาภาษาประเภท functional เช่น Scheme พื้นฐานการทำงานของ list คือฟังก์ชั่น (), cons, car, และ cdr  list ในภาษาScheme เกิดจากการใช้ cons รวบรวมสิ่งของต่างๆ  ผลของการใช้ฟังก์ชั่น cons คือ ของสองสิ่งนั้นจะรวมกันเป็น คู่(pair)  ซึ่งถ้าหากของสิ่งที่สองเป็นชนิด pair อยู่แล้วผลของการ cons ก็คือ list นั่นเอง โดยสมาชิกของ list คือ ของชิ้นที่พึ่ง cons เข้าไป, ของชิ้นแรกใน pair, ของชิ้นที่สองใน pair

* () ใน Scheme หมายถึง list เปล่า (empty list) ซึ่งก็คือ เซตว่าง

จะเห็นได้ว่าคุณลักษณะและคุณสมบัติเด่นของ list มีดังนี้

  • list ไม่จำกัดจำนวนสมาชิก (A list has zero or more members.)
  • สมาชิกของ list ไม่จำเป็นต้องเป็นของชนิดเดียวกัน (List members can be heterogenous.)  * ใน Java ใช้ Generic Types
  • สมาชิกของ list เรียงกันอยู่ (List is a sequence.)
  • list สามารถเพิ่มหรือลดจำนวนสมาชิกได้ (Members can be appended and removed.)

Syntax ภาษาPython กำหนด list โดยใช้อักขระ '[' และ ']' ล้อมรอบรายชื่อสมาชิกของ list 

เรามาลองดูตัวอย่างการใช้ list แบบง่ายๆกันก่อน:

* ใน intepreter Python

- สร้าง list เปล่า

[]                         
# []

- ลองดูว่า type ของ ข้างบนคืออะไร

type([])                 
# <type 'list'>

- กำหนดให้ตัวแปร a เป็น list เปล่า แล้วเช็คขนาด list  จากนั้น

a = []
len(a)                   
# 0

- กำหนดให้ตัวแปร b เป็น list ที่มีสมาชิก 4 ตัว คือ อักขระ 'a', 'b', 'c', 'd'

b = [ 'a', 'b', 'c', 'd' ]
len(b)                   
# 4

- ใช้ for expression ในการ loop รายชื่อสิ่งของใน b

for i in b:
print i
# a
# b
# c
# d

- ตรวจดูภายในของ b มาดูกันว่า object ที่เป็น list นั้นมีองค์ประกอบอะไรบ้าง

type(b)
# <type 'list'>
dir(b)
# ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', 
# '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__',
# '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__',
# '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__',
# '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__',
# 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

   เราจะเห็นว่ามันจะมี method ที่เด่นๆดังนี้: append, count, extend, index, insert, pop, remove, reverse, sort

b.append('e')

b

['a', 'b', 'c', 'd', 'e']

range คำสั่ง range คืนค่า list

ทีนี้มาดูเรื่อง List Comprehension กัน

[ i + 'b' for i in b ]

Python จะสร้าง list ที่มี i + 'b' เป็นสามชิก โดย i มาจาก for i in b

เราสามารถเพิ่มข้อแม้ ได้ที่ for i in b phrase เช่น เพิ่ม if cluse เข้าไป

c = [1 - 10 ]

[ for i in c if i ]

เมื่อใช้ list comprehension ไม่ต้องใช้ : หลัง for หรือ if

d = range(100)   # 0 - 100

filter for even number

[ i for i in c if i % 2 == 0]

lambda

lambda x y: x + y

(lambda x: x-1)(2)

[ (lambda x: x-1)(i) for i in c ]

[].join

c=range(200)

[ str(i) for i in c ]

''.join( [ str(i) for i in c ] )

Next:

map() reduce() filter()

filter(None, c)

filter( lambda t: True, c)                   filter( lambda t: False, c)

map( lambda i: i^4, c)

reduce( <func of two args>, <sequence>)  , left to right passed as args to func

reduce( lambda a, b: a + b , c)   # 19900

first_digit = lambda s: ( str(num)[0], str(num)[1:]  )

split  num = 234456  into list of digits

[ str(num)[i] for i in range( len(str(num)) ) ]

 

 

References:

http://docs.python.org/tutorial/datastructures.html