รวมรายการตัวเลขใน Python


367

ฉันมีรายการของตัวเลขเช่น[1,2,3,4,5...]และฉันต้องการคำนวณ(1+2)/2และสำหรับที่สอง(2+3)/2และที่สาม (3+4)/2และอื่น ๆ ฉันจะทำสิ่งนั้นได้อย่างไร

ฉันต้องการรวมเลขตัวแรกกับตัวที่สองแล้วหารด้วย 2 จากนั้นหาผลรวมของตัวที่สองกับตัวที่สามแล้วหารด้วย 2 และต่อไปเรื่อย ๆ

นอกจากนี้ฉันจะรวมรายการตัวเลขได้อย่างไร

a = [1, 2, 3, 4, 5, ...]

ใช่ไหม:

b = sum(a)
print b

รับหมายเลขเดียว

มันไม่ได้ผลสำหรับฉัน


รายการนี้นานเท่าไหร่ ค่าจะสุ่มระหว่าง 0 ถึง 1 อย่างไร
kevpie

2
หากคุณกำหนดผลรวมก่อนที่มันจะทำให้งูหลามเลอะลองลบผลรวม บางทีมันอาจจะถูกกำหนดไว้ในรหัสบางแห่งและเขียนทับฟังก์ชั่นเริ่มต้น ดังนั้นฉันจึงลบมันและแก้ไขปัญหาได้แล้ว (ตอบโดยผู้ใช้ 4183543)
NicoKowe

1
"สิ่งนี้ไม่ทำงาน" ไม่ใช่คำอธิบายปัญหา
มาร์ควิสแห่ง Lorne

คำตอบ:


279

คำถามที่ 1: คุณต้องการ (องค์ประกอบ 0 + องค์ประกอบ 1) / 2, (องค์ประกอบ 1 + องค์ประกอบ 2) / 2, ... ฯลฯ

เราสร้างสองรายการ: หนึ่งในทุกองค์ประกอบยกเว้นรายการแรกและหนึ่งในทุกองค์ประกอบยกเว้นรายการสุดท้าย จากนั้นค่าเฉลี่ยที่เราต้องการคือค่าเฉลี่ยของแต่ละคู่ที่นำมาจากรายการทั้งสอง เราใช้zipเพื่อจับคู่จากสองรายการ

ฉันคิดว่าคุณต้องการดูทศนิยมในผลลัพธ์แม้ว่าค่าอินพุตของคุณจะเป็นจำนวนเต็มก็ตาม โดยค่าเริ่มต้น Python จะแบ่งจำนวนเต็ม: มันจะทิ้งส่วนที่เหลือ ในการแบ่งสิ่งต่าง ๆ ตลอดทางเราจำเป็นต้องใช้ตัวเลขทศนิยม โชคดีที่แบ่งเป็น int โดยลอยลอยจะผลิตเพื่อให้เราเพียงแค่ใช้สำหรับตัวหารของเราแทน2.02

ดังนั้น:

averages = [(x + y) / 2.0 for (x, y) in zip(my_list[:-1], my_list[1:])]

คำถามที่ 2:

การใช้งานsumควรจะทำงานได้ดี ผลงานดังต่อไปนี้:

a = range(10)
# [0,1,2,3,4,5,6,7,8,9]
b = sum(a)
print b
# Prints 45

นอกจากนี้คุณไม่จำเป็นต้องกำหนดทุกอย่างให้กับตัวแปรในทุกขั้นตอน print sum(a)ทำงานได้ดี

คุณจะต้องเฉพาะเจาะจงมากขึ้นเกี่ยวกับสิ่งที่คุณเขียนและวิธีการทำงาน


ฉันไม่ได้รับสำหรับคำถามแรกที่ฉันได้รับยังไม่ได้กำหนด my_list ในโปรแกรมของฉันหมายเลขสุ่มไม่ใช่ 1, 2, 3, 4 .. สำหรับคำถามที่สองฉันไม่ทำงานกับฉันฉันไม่รู้ว่าทำไม
layo

37
my_listมีการกำหนดก็ต่อเมื่อคุณกำหนดไว้ ที่ควรจะเป็นผู้ถือสถานที่สำหรับสิ่งที่คุณเรียกว่ารายการที่คุณพยายามที่จะทำงานกับ ฉันเดาไม่ออกเลยว่าคุณเรียกมันว่าอะไร
Karl Knechtel

2
6 ปีต่อมาโพสต์นี้ยังคงช่วยเหลือผู้คน ฉันมีความผิดพลาดในโค้ดของฉันและสามารถใช้โพสต์ของคุณเพื่อยืนยันว่าแนวคิดที่เกี่ยวข้องในโค้ดของคุณนั้นถูกต้องดังนั้นปัญหาต้องอยู่ที่อื่น จากนั้นฉันก็พบว่า เพิ่งให้คุณและคนที่มีคำถามโหวตขึ้นขอบคุณอย่างรวดเร็ว ด้วยความปรารถนาดี
TMWP

1
@KarlKnechtel เขามีรายการในคำถามของเขาและมันถูกเรียกว่า " a"
HelloGoodbye

1
ตั้งแต่zipหยุดเมื่อถึงจุดสิ้นสุดของอาร์กิวเมนต์ที่สั้นกว่าzip(my_list, my_list[1:])ก็เพียงพอแล้ว
chepner

115

ผลรวมของตัวเลข:

sum(list_of_nums)

การคำนวณครึ่งหนึ่งของ n และ n - 1 (ถ้าฉันมีรูปแบบที่ถูกต้อง) โดยใช้รายการความเข้าใจ :

[(x + (x - 1)) / 2 for x in list_of_nums]

รวมองค์ประกอบที่อยู่ติดกันเช่น ((1 + 2) / 2) + ((2 + 3) / 2) + ... โดยใช้การลดและlambdas

reduce(lambda x, y: (x + y) / 2, list_of_nums)

4
ฉันคิดว่าเขาต้องการรวมองค์ประกอบที่อยู่ติดกัน จะไม่มีจุดในการรับเฉลี่ยxและx - 1; เราสามารถลบ 0.5 แทนได้
Karl Knechtel

4
ฟังก์ชั่นลดไม่ทำในสิ่งที่โพสต์พูด จะคำนวณ (((a1 + a2) / 2 + a3) / 2 + a4) / 2 ...
Moberg

from functools import reduce
tyrex

70

คำถามที่ 2: เพื่อรวมรายการจำนวนเต็ม:

a = [2, 3, 5, 8]
sum(a)
# 18
# or you can do:
sum(i for i in a)
# 18

หากรายการมีจำนวนเต็มเป็นสตริง:

a = ['5', '6']
# import Decimal: from decimal import Decimal
sum(Decimal(i) for i in a)

4
sum(i for i in a)ซ้ำซ้อน
Jean-François Fabre

6
sum(Decimal(i) for i in a)=> sum(int(i) for i in a)หรือsum(map(int,a))
Jean-François Fabre

34

คุณสามารถลองวิธีนี้:

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
sm = sum(a[0:len(a)]) # Sum of 'a' from 0 index to 9 index. sum(a) == sum(a[0:len(a)]
print(sm) # Python 3
print sm  # Python 2

4
ไม่จำเป็นต้องสร้างสำเนาแบบนี้และมันก็เป็นเสียงที่ไพเราะอย่างน่ากลัว หลีกเลี่ยงโรคระบาดแม้จะมีคะแนนโหวตทั้งหมด ...
Jean-François Fabre

@ Jean-FrançoisFabreคุณช่วยกรุณาอธิบายความคิดเห็นของคุณได้ไหม? ทำไมเรื่องนี้ถึงไม่น่ากลัว?
PierreF

สำหรับผู้เริ่มa[0:len(a)]สร้างสำเนาaสิ่งที่เป็นจุดนอกเหนือจากการสูญเสียซีพียูและหน่วยความจำ? แล้วprint(sm)ก็ทำงานใน python 2 ฉันไม่เข้าใจว่าทำไมมันถึงมี upvotes มากมายในกลางปี ​​2017 ... แต่มันใช้ได้กับคำตอบส่วนใหญ่ที่นี่
Jean-François Fabre

27
>>> a = range(10)
>>> sum(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable
>>> del sum
>>> sum(a)
45

ดูเหมือนว่าsumมีการกำหนดไว้ในรหัสบางแห่งและแทนที่ฟังก์ชั่นเริ่มต้น ดังนั้นฉันจึงลบมันและแก้ไขปัญหาได้แล้ว


16

ใช้ง่ายlist-comprehensionและsum:

>> sum(i for i in range(x))/2. #if x = 10 the result will be 22.5

4
คุณไม่จำเป็นต้องใช้[และ]คุณสามารถส่งนิพจน์ตัวสร้างsum(i/2. for i in range(x))
Ivan

1
sum(range(x)) / 2.หลีกเลี่ยงทุกแผนกเพียงแค่แบ่งในที่สุด
Jean-François Fabre

13

คำตอบทั้งหมดแสดงวิธีการเขียนโปรแกรมและทั่วไป ฉันแนะนำวิธีการทางคณิตศาสตร์เฉพาะสำหรับกรณีของคุณ มันสามารถเร็วขึ้นโดยเฉพาะสำหรับรายการยาว มันใช้งานได้เพราะรายการของคุณเป็นรายการหมายเลขธรรมชาติถึงn:

สมมติว่าเรามีตัวเลขตามธรรมชาติ1, 2, 3, ..., 10:

>>> nat_seq = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

คุณสามารถใช้sumฟังก์ชั่นในรายการ:

>>> print sum(nat_seq)
55

คุณยังสามารถใช้สูตรn*(n+1)/2โดยที่nค่าขององค์ประกอบสุดท้ายในรายการ (ที่นี่nat_seq[-1]:) ดังนั้นคุณจึงหลีกเลี่ยงการวนซ้ำองค์ประกอบได้:

>>> print (nat_seq[-1]*(nat_seq[-1]+1))/2
55

ในการสร้างลำดับ(1+2)/2, (2+3)/2, ..., (9+10)/2คุณสามารถใช้ตัวสร้างและสูตร(2*k-1)/2.(จดบันทึกจุดเพื่อสร้างค่าจุดลอยตัว) คุณต้องข้ามองค์ประกอบแรกเมื่อสร้างรายการใหม่:

>>> new_seq = [(2*k-1)/2. for k in nat_seq[1:]]
>>> print new_seq
[1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5]

ที่นี่ด้วยคุณสามารถใช้sumฟังก์ชั่นในรายการนั้น:

>>> print sum(new_seq)
49.5

แต่คุณสามารถใช้สูตร(((n*2+1)/2)**2-1)/2เพื่อหลีกเลี่ยงการวนซ้ำองค์ประกอบ:

>>> print (((new_seq[-1]*2+1)/2)**2-1)/2
49.5

6

วิธีที่ง่ายที่สุดในการแก้ปัญหานี้:

l =[1,2,3,4,5]
sum=0
for element in l:
    sum+=element
print sum



3

เครื่องกำเนิดไฟฟ้าเป็นวิธีที่ง่ายในการเขียน:

from __future__ import division
# ^- so that 3/2 is 1.5 not 1

def averages( lst ):
    it = iter(lst) # Get a iterator over the list
    first = next(it)
    for item in it:
        yield (first+item)/2
        first = item

print list(averages(range(1,11)))
# [1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5]

คุณสามารถหารด้วย 2.0 เพื่อหลีกเลี่ยงการหารจำนวนเต็ม
Chris Anderson

@ChrisAnderson ไม่เป็นจริงใน python 3. การแบ่งจุดทศนิยมเป็นค่าเริ่มต้น
Justin Meiners

3

ให้เราทำให้เป็นเรื่องง่ายสำหรับผู้เริ่มต้น: -

  1. globalคำหลักที่จะช่วยให้ข้อความตัวแปรทั่วโลกจะได้รับมอบหมายภายในฟังก์ชั่นหลักโดยไม่ต้องผลิตตัวแปรท้องถิ่นใหม่
    message = "This is a global!"


def main():
    global message
    message = "This is a local"
    print(message)


main()
# outputs "This is a local" - From the Function call
print(message)
# outputs "This is a local" - From the Outer scope

แนวคิดนี้เรียกว่าShadowing

  1. รวมรายการตัวเลขใน Python
nums = [1, 2, 3, 4, 5]

var = 0


def sums():
    for num in nums:
        global var
        var = var + num
    print(var)


if __name__ == '__main__':
    sums()

เอาท์พุท = 15


2

ใช้pairwise สูตร itertools :

import itertools
def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = itertools.tee(iterable)
    next(b, None)
    return itertools.izip(a, b)

def pair_averages(seq):
    return ( (a+b)/2 for a, b in pairwise(seq) )

2

สั้นและง่าย:

def ave(x,y):
  return (x + y) / 2.0

map(ave, a[:-1], a[1:])

และนี่คือลักษณะ:

>>> a = range(10)
>>> map(ave, a[:-1], a[1:])
[0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5]

เนื่องจากความโง่เขลาของบางอย่างในวิธีหลามจัดการมากกว่าสองรายการที่คุณจะต้องตัดรายการmap a[:-1]มันทำงานได้มากกว่าที่คุณคาดหวังถ้าคุณใช้itertools.imap:

>>> import itertools
>>> itertools.imap(ave, a, a[1:])
<itertools.imap object at 0x1005c3990>
>>> list(_)
[0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5]

สั้นใช่ ง่าย? มันต้องการคำอธิบายที่ยาวกว่าคำตอบที่ยาวเพื่อที่จะเข้าใจว่ามันกำลังทำอะไรอยู่
tekHedd

สิ่งนี้จะแนะนำข้อผิดพลาดในการสะสมคะแนนลอยตัว หารในท้ายที่สุดแทน
Jean-François Fabre

1
@ Jean-FrançoisFabreทั้งสองวิธีนั้นไม่สมบูรณ์ - การหารท้ายจะล้นออกมาเป็นจำนวนมากการแก้ปัญหาขึ้นอยู่กับข้อมูล (และกรณีการใช้งาน)
cz

2

วิธีแก้ปัญหามากมาย แต่สิ่งที่ฉันโปรดปรานยังขาดหายไป:

>>> import numpy as np
>>> arr = np.array([1,2,3,4,5])

อาร์เรย์ numpy ไม่แตกต่างจากรายการมากเกินไป (ในกรณีใช้งานนี้) ยกเว้นว่าคุณสามารถใช้อาร์เรย์เหมือนหมายเลข:

>>> ( arr[:-1] + arr[1:] ) / 2.0
[ 1.5  2.5  3.5  4.5]

ทำ!

คำอธิบาย

ดัชนีแฟนซีหมายถึงสิ่งนี้: [1:]รวมองค์ประกอบทั้งหมดจาก 1 ถึงจุดสิ้นสุด (เช่นการละเว้นองค์ประกอบ 0) และ[:-1]เป็นองค์ประกอบทั้งหมดยกเว้นอันสุดท้าย:

>>> arr[:-1]
array([1, 2, 3, 4])
>>> arr[1:]
array([2, 3, 4, 5])

ดังนั้นการเพิ่มสองอันนี้จะทำให้คุณมีอาร์เรย์ซึ่งประกอบด้วย elemens (1 + 2), (2 + 3) และอื่น ๆ ไม่ใช่ว่าฉันหารด้วย2.0ไม่ใช่2เพราะอย่างอื่น Python เชื่อว่าคุณใช้เลขจำนวนเต็มและสร้างผลลัพธ์จำนวนเต็มแบบปัด

ข้อได้เปรียบของการใช้ numpy

Numpy สามารถมากเร็วกว่าลูปรอบรายการของตัวเลข ขนาดของรายการของคุณมีขนาดใหญ่คำสั่งของขนาดที่เร็วขึ้น ยิ่งไปกว่านั้นมันมีรหัสน้อยกว่าและอย่างน้อยสำหรับฉันก็อ่านง่ายขึ้น ฉันพยายามทำให้เป็นนิสัยจากการใช้ numpy สำหรับทุกกลุ่มของตัวเลขและมันเป็นการปรับปรุงครั้งใหญ่สำหรับลูปและลูป - ภายใน - ลูปที่ฉันต้องทำ


1

ฉันแค่ใช้แลมบ์ดากับแผนที่ ()

a = [1,2,3,4,5,6,7,8,9,10]
b = map(lambda x, y: (x+y)/2.0, fib[:-1], fib[1:])
print b

1

ฉันใช้การwhileวนซ้ำเพื่อให้ได้ผลลัพธ์:

i = 0
while i < len(a)-1:
   result = (a[i]+a[i+1])/2
   print result
   i +=1

1

วนรอบองค์ประกอบในรายการและอัปเดตผลรวมดังนี้:

def sum(a):
    total = 0
    index = 0
    while index < len(a):
        total = total + a[index]
        index = index + 1
    return total

1

ขอบคุณKarl Knechtelฉันสามารถเข้าใจคำถามของคุณ การตีความของฉัน:

  1. คุณต้องการรายการใหม่ที่มีค่าเฉลี่ยขององค์ประกอบ i และ i + 1
  2. คุณต้องการที่จะรวมองค์ประกอบแต่ละรายการในรายการ

คำถามแรกที่ใช้ฟังก์ชั่นนิรนาม (aka. ฟังก์ชั่นแลมบ์ดา):

s = lambda l: [(l[0]+l[1])/2.] + s(l[1:]) if len(l)>1 else []  #assuming you want result as float
s = lambda l: [(l[0]+l[1])//2] + s(l[1:]) if len(l)>1 else []  #assuming you want floor result

คำถามที่สองยังใช้ฟังก์ชั่นนิรนาม (aka. ฟังก์ชั่นแลมบ์ดา):

p = lambda l: l[0] + p(l[1:]) if l!=[] else 0

คำถามทั้งสองรวมกันในรหัสบรรทัดเดียว:

s = lambda l: (l[0]+l[1])/2. + s(l[1:]) if len(l)>1 else 0  #assuming you want result as float
s = lambda l: (l[0]+l[1])/2. + s(l[1:]) if len(l)>1 else 0  #assuming you want floor result

ใช้ที่ตรงกับความต้องการของคุณมากที่สุด


1

คุณสามารถทำสิ่งเดียวกันโดยใช้การสอบถามซ้ำ:

Python Snippet:

def sumOfArray(arr, startIndex):
    size = len(arr)
    if size == startIndex:  # To Check empty list
        return 0
    elif startIndex == (size - 1): # To Check Last Value
        return arr[startIndex]
    else:
        return arr[startIndex] + sumOfArray(arr, startIndex + 1)


print(sumOfArray([1,2,3,4,5], 0))

0

ลองใช้รายการความเข้าใจ สิ่งที่ต้องการ:

new_list = [(old_list[i] + old_list[i+1])/2 for i in range(len(old_list-1))]

@Rafe มันเป็นหนึ่งในการทำงาน (ถ้าเราเพิ่งแก้ไขวงเล็บท้าย - ควรจะrange(len(old_list) - 1)) แต่ Pythonistas ขมวดคิ้วโดยรวมของ 'ช่วง' และ 'len' ข้อพิสูจน์ว่า "ควรมีทางเดียวเท่านั้นที่จะทำได้" คือ "ห้องสมุดมาตรฐานให้วิธีการในการหลีกเลี่ยงสิ่งที่น่าเกลียด" การทำซ้ำทางอ้อม - วนซ้ำตามลำดับหมายเลขเพื่อให้คุณสามารถใช้ตัวเลขเหล่านี้เพื่อจัดทำดัชนีสิ่งที่คุณต้องการย้ำซ้ำ ๆ - เป็นสิ่งที่น่าเกลียด
Karl Knechtel

0

ในจิตวิญญาณของมันเครื่องมือ แรงบันดาลใจจากสูตรคู่

from itertools import tee, izip

def average(iterable):
    "s -> (s0,s1)/2.0, (s1,s2)/2.0, ..."
    a, b = tee(iterable)
    next(b, None)
    return ((x+y)/2.0 for x, y in izip(a, b))

ตัวอย่าง:

>>>list(average([1,2,3,4,5]))
[1.5, 2.5, 3.5, 4.5]
>>>list(average([1,20,31,45,56,0,0]))
[10.5, 25.5, 38.0, 50.5, 28.0, 0.0]
>>>list(average(average([1,2,3,4,5])))
[2.0, 3.0, 4.0]

0
n = int(input("Enter the length of array: "))
list1 = []
for i in range(n):
    list1.append(int(input("Enter numbers: ")))
print("User inputs are", list1)

list2 = []
for j in range(0, n-1):
    list2.append((list1[j]+list1[j+1])/2)
print("result = ", list2)

0

วิธีง่ายๆคือใช้การเปลี่ยนรูปแบบ iter_tools

# If you are given a list

numList = [1,2,3,4,5,6,7]

# and you are asked to find the number of three sums that add to a particular number

target = 10
# How you could come up with the answer?

from itertools import permutations

good_permutations = []

for p in permutations(numList, 3):
    if sum(p) == target:
        good_permutations.append(p)

print(good_permutations)

ผลลัพธ์คือ:

[(1, 2, 7), (1, 3, 6), (1, 4, 5), (1, 5, 4), (1, 6, 3), (1, 7, 2), (2, 1, 7), (2, 3, 
5), (2, 5, 3), (2, 7, 1), (3, 1, 6), (3, 2, 5), (3, 5, 2), (3, 6, 1), (4, 1, 5), (4, 
5, 1), (5, 1, 4), (5, 2, 3), (5, 3, 2), (5, 4, 1), (6, 1, 3), (6, 3, 1), (7, 1, 2), 
(7, 2, 1)]

โปรดทราบว่าคำสั่งซื้อมีความสำคัญ - ความหมาย 1, 2, 7 จะแสดงเป็น 2, 1, 7 และ 7, 1, 2 คุณสามารถลดสิ่งนี้ได้โดยใช้ชุด


0

ใน Python 3.8 ผู้ดำเนินการที่ได้รับมอบหมายใหม่สามารถใช้ได้

>>> my_list = [1, 2, 3, 4, 5]
>>> itr = iter(my_list)
>>> a = next(itr)
>>> [(a + (a:=x))/2 for x in itr]
[1.5, 2.5, 3.5, 4.5]

aเป็นการอ้างอิงที่กำลังทำงานกับค่าก่อนหน้าในรายการดังนั้นจึงถูกเตรียมใช้งานกับองค์ประกอบแรกของรายการและเกิดการวนซ้ำในส่วนที่เหลือของรายการการอัพเดทaหลังจากใช้ในการทำซ้ำแต่ละครั้ง

iterator my_list[1:]ชัดเจนถูกนำมาใช้เพื่อหลีกเลี่ยงการต้องสร้างสำเนาของรายการโดยใช้


-3

ลองต่อไปนี้ -

mylist = [1, 2, 3, 4]   

def add(mylist):
    total = 0
    for i in mylist:
        total += i
    return total

result = add(mylist)
print("sum = ", result)

2
คำตอบใหม่ควรแตกต่างจากคำตอบเดิมอย่างชัดเจน นอกจากนี้sumฟังก์ชั่นของคุณไม่แตกต่างจากsumพฤติกรรมหรือชื่อในตัว คุณสามารถลบคำจำกัดความของฟังก์ชั่นออกจากคำตอบของคุณได้และมันก็ยังใช้ได้อยู่
Noumenon

คุณช่วยกรุณาตรวจสอบตอนนี้
Sai G

2
ฉันขอขอบคุณที่คุณกำลังปรับปรุงคำตอบของคุณ! ชื่อตัวแปรมีความหมายมากกว่าและไม่สร้างเงาภายใน แต่ปัญหาพื้นฐานยังคงมี: แนวทางสำหรับวงที่จัดเตรียมไว้แล้วโดยstackoverflow.com/a/35359188/733092sumข้างต้นและฟังก์ชั่นที่มีความซ้ำซ้อนกับในตัว คุณจะได้รับแบบทดสอบตอบคำถามอย่างถูกต้อง แต่คำตอบของ StackOverflow ก็จำเป็นต้องมีประโยชน์สำหรับผู้ที่มาถึงหน้านี้และคำตอบที่ซ้ำกันก็ไม่ใช่
Noumenon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.