วิธีการสร้างชุดรายการในรายการหลาม?


170

ฉันมีlistชื่อไฟล์ในหลามและฉันต้องการสร้างsetชื่อไฟล์ทั้งหมด

filelist=[]
for filename in filelist:
    set(filename)

ดูเหมือนจะใช้งานไม่ได้ ทำสิ่งนี้ได้อย่างไร

คำตอบ:


322

หากคุณมีรายการของวัตถุที่แฮช (ชื่อไฟล์อาจเป็นสตริงดังนั้นจึงควรนับ):

lst = ['foo.py', 'bar.py', 'baz.py', 'qux.py', Ellipsis]

คุณสามารถสร้างชุดโดยตรง:

s = set(lst)

ในความเป็นจริงsetจะทำงานด้วยวิธีนี้กับวัตถุซ้ำ ๆ ! (เป็ดพิมพ์ออกมาไม่ดีใช่มั้ย)


หากคุณต้องการทำซ้ำ:

s = set()
for item in iterable:
    s.add(item)

แต่ไม่จำเป็นต้องทำเช่นนี้ ฉันพูดถึงเพียงเพราะset.addวิธีนี้มีประโยชน์มาก


1
ฉันใช้ 2.7 และดูเหมือนจะใช้งานไม่ได้ เกิดอะไรขึ้นที่นี่? Python 2.7.13 (ค่าเริ่มต้น, 24 ก.ค. 2017, 14:22:59) [GCC 4.2.1 เข้ากันได้กับแอปเปิ้ล LLVM 8.1.0 (clang-802.0.42)] บนดาร์วินประเภท "ช่วยเหลือ", "ลิขสิทธิ์", "เครดิต" หรือ "ใบอนุญาต" สำหรับข้อมูลเพิ่มเติม >>> x = [1,2,3] >>> set (x) set ([1, 2, 3]) >>>
opus111

@ user1902291-- ดูเหมือนว่ามันใช้งานได้คุณเพิ่งจะติดตามชุดผลลัพธ์: y = set(x)
mgilson

โปรดทราบว่าการเพิ่มรายการในชุดจากรายการสามารถพิสูจน์ได้ว่ามีประโยชน์มากเมื่อคุณต้องการกรองรายการที่ซ้ำกันออกจากรายการ
Pranjal Kumar

12

ทางออกที่ตรงที่สุดคือ:

 s = set(filelist)

ปัญหาในรหัสเดิมของคุณคือการที่ค่าที่ไม่ถูกมอบหมายให้ไปชุด นี่คือรหัสที่แก้ไขแล้วของคุณ:

 s = set()
 for filename in filelist:
     s.add(filename)
 print(s)

9

คุณทำได้

my_set = set(my_list)

หรือสำหรับ Python 3

my_set = {*my_list}

เพื่อสร้างชุดจากรายการ ในทางกลับกันคุณสามารถทำได้

my_list = list(my_set)

หรือสำหรับ Python 3

my_list = [*my_set]

เพื่อสร้างรายการจากชุด

เพิ่งทราบว่าลำดับขององค์ประกอบในรายการนั้นหายไปโดยทั่วไปเมื่อแปลงรายการเป็นชุดเนื่องจากชุดไม่มีการเรียงลำดับโดยเนื้อแท้ (ยกเว้นหนึ่งใน CPython ดูเหมือนว่าจะเป็นถ้ารายการประกอบด้วยจำนวนเต็มไม่เป็นลบเท่านั้น แต่ฉันคิดว่านี่เป็นผลของการใช้ชุดใน CPython และพฤติกรรมนี้อาจแตกต่างกันระหว่างการใช้งาน Python ที่แตกต่างกัน)


4

นี่คือทางออกอื่น:

>>>list1=["C:\\","D:\\","E:\\","C:\\"]
>>>set1=set(list1)
>>>set1
set(['E:\\', 'D:\\', 'C:\\'])

ในรหัสนี้ฉันได้ใช้วิธีการตั้งค่าเพื่อที่จะทำให้มันกลายเป็นชุดแล้วมันจะลบค่าที่ซ้ำกันทั้งหมดจากรายการ


1

วิธีหนึ่งทั่วไปในการสร้างชุดในแบบวนซ้ำเช่นนี้:

aset = {e for e in alist}

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.