ฉันมีlist
ชื่อไฟล์ในหลามและฉันต้องการสร้างset
ชื่อไฟล์ทั้งหมด
filelist=[]
for filename in filelist:
set(filename)
ดูเหมือนจะใช้งานไม่ได้ ทำสิ่งนี้ได้อย่างไร
ฉันมีlist
ชื่อไฟล์ในหลามและฉันต้องการสร้างset
ชื่อไฟล์ทั้งหมด
filelist=[]
for filename in filelist:
set(filename)
ดูเหมือนจะใช้งานไม่ได้ ทำสิ่งนี้ได้อย่างไร
คำตอบ:
หากคุณมีรายการของวัตถุที่แฮช (ชื่อไฟล์อาจเป็นสตริงดังนั้นจึงควรนับ):
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
วิธีนี้มีประโยชน์มาก
y = set(x)
ทางออกที่ตรงที่สุดคือ:
s = set(filelist)
ปัญหาในรหัสเดิมของคุณคือการที่ค่าที่ไม่ถูกมอบหมายให้ไปชุด นี่คือรหัสที่แก้ไขแล้วของคุณ:
s = set()
for filename in filelist:
s.add(filename)
print(s)
คุณทำได้
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 ที่แตกต่างกัน)
นี่คือทางออกอื่น:
>>>list1=["C:\\","D:\\","E:\\","C:\\"]
>>>set1=set(list1)
>>>set1
set(['E:\\', 'D:\\', 'C:\\'])
ในรหัสนี้ฉันได้ใช้วิธีการตั้งค่าเพื่อที่จะทำให้มันกลายเป็นชุดแล้วมันจะลบค่าที่ซ้ำกันทั้งหมดจากรายการ
วิธีหนึ่งทั่วไปในการสร้างชุดในแบบวนซ้ำเช่นนี้:
aset = {e for e in alist}
ใส่บรรทัด:
new_list = set(your_list)