คำถามติดแท็ก list-comprehension

โครงสร้างทางวากยสัมพันธ์ซึ่งให้วิธีที่กระชับในการสร้างรายการในลักษณะที่คล้ายคลึงกับสัญกรณ์ชุดตัวสร้างทางคณิตศาสตร์ เนื่องจากหลายภาษาสนับสนุนความเข้าใจในรายการโปรดใช้แท็กนี้ร่วมกับแท็กของภาษาโปรแกรม

7
Python ใช้แจกแจงความเข้าใจภายในรายการ
สมมติว่าฉันมีรายการดังนี้: mylist = ["a","b","c","d"] ในการรับค่าที่พิมพ์พร้อมกับดัชนีฉันสามารถใช้enumerateฟังก์ชันของ Python เช่นนี้ >>> for i,j in enumerate(mylist): ... print i,j ... 0 a 1 b 2 c 3 d >>> ตอนนี้เมื่อฉันพยายามใช้ภายในlist comprehensionมันทำให้ฉันเกิดข้อผิดพลาดนี้ >>> [i,j for i,j in enumerate(mylist)] File "<stdin>", line 1 [i,j for i,j in enumerate(mylist)] ^ SyntaxError: invalid syntax ดังนั้นคำถามของฉันคืออะไรคือวิธีที่ถูกต้องในการใช้การระบุความเข้าใจภายในรายการ?

6
วิธีจัดการข้อยกเว้นในการทำความเข้าใจรายการ?
ฉันมีความเข้าใจรายการใน Python ซึ่งการวนซ้ำแต่ละครั้งอาจทำให้เกิดข้อยกเว้นได้ ตัวอย่างเช่นถ้าฉันมี: eggs = (1,3,0,3,2) [1/egg for egg in eggs] ฉันจะได้รับZeroDivisionErrorข้อยกเว้นในองค์ประกอบที่ 3 ฉันจะจัดการกับข้อยกเว้นนี้และดำเนินการทำความเข้าใจรายการต่อไปได้อย่างไร วิธีเดียวที่ฉันคิดได้คือใช้ฟังก์ชันตัวช่วย: def spam(egg): try: return 1/egg except ZeroDivisionError: # handle division by zero error # leave empty for now pass แต่มันดูยุ่งยากสำหรับฉัน มีวิธีที่ดีกว่านี้ใน Python หรือไม่? หมายเหตุ: นี่เป็นตัวอย่างง่ายๆ (ดู " ตัวอย่าง " ด้านบน) ที่ฉันจัดทำขึ้นเนื่องจากตัวอย่างจริงของฉันต้องการบริบทบางอย่าง ฉันไม่สนใจที่จะหลีกเลี่ยงการหารด้วยข้อผิดพลาดเป็นศูนย์ แต่ในการจัดการข้อยกเว้นในการทำความเข้าใจรายการ

6
ความเข้าใจในรายการจะย้อนชื่อแม้จะอยู่ในขอบเขตของความเข้าใจ นี่ใช่มั้ย?
ความเข้าใจกำลังมีปฏิสัมพันธ์ที่ไม่คาดคิดกับการกำหนดขอบเขต นี่คือพฤติกรรมที่คาดหวังหรือไม่? ฉันมีวิธีการ: def leave_room(self, uid): u = self.user_by_id(uid) r = self.rooms[u.rid] other_uids = [ouid for ouid in r.users_by_id.keys() if ouid != u.uid] other_us = [self.user_by_id(uid) for uid in other_uids] r.remove_user(uid) # OOPS! uid has been re-bound by the list comprehension above # Interestingly, it's rebound to the last uid …

10
วิธี Pythonic ในการพิมพ์รายการ
ฉันต้องการทราบว่ามีวิธีที่ดีกว่าในการพิมพ์วัตถุทั้งหมดในรายการ Python มากกว่านี้หรือไม่: myList = [Person("Foo"), Person("Bar")] print("\n".join(map(str, myList))) Foo Bar ฉันอ่านวิธีนี้ไม่ดีจริงๆ: myList = [Person("Foo"), Person("Bar")] for p in myList: print(p) ไม่มีสิ่งที่ชอบ: print(p) for p in myList ถ้าไม่คำถามของฉันคือ ... ทำไม? หากเราสามารถทำสิ่งประเภทนี้ด้วยรายการที่ครอบคลุมทำไมไม่เป็นคำสั่งง่ายๆนอกรายการ?

2
ฟอร์ลูปในแพนด้าแย่จริงหรือ? ควรดูแลเมื่อใด
มีforลูปมัน "เลวร้าย"? ถ้าไม่เช่นนั้นในสถานการณ์ใดจะดีไปกว่าการใช้แนวทาง "vectorized" แบบเดิม ๆ 1 ฉันคุ้นเคยกับแนวคิดของ "vectorization" และวิธีที่แพนด้าใช้เทคนิคเวกเตอร์เพื่อเร่งความเร็วในการคำนวณ ฟังก์ชัน Vectorized จะออกอากาศการดำเนินการในทั้งซีรีส์หรือ DataFrame เพื่อให้ได้ความเร็วที่สูงกว่าการทำซ้ำตามปกติในข้อมูล อย่างไรก็ตามฉันค่อนข้างแปลกใจที่เห็นโค้ดจำนวนมาก (รวมถึงจากคำตอบใน Stack Overflow) เสนอวิธีแก้ปัญหาที่เกี่ยวข้องกับการวนซ้ำข้อมูลโดยใช้การวนซ้ำforและความเข้าใจในรายการ เอกสารประกอบและ API บอกว่าลูป "ไม่ดี" และควร "ไม่" ซ้ำในอาร์เรย์ชุดข้อมูลหรือเฟรมข้อมูล แล้วทำไมบางครั้งฉันจึงเห็นผู้ใช้แนะนำโซลูชันแบบวนซ้ำ 1 - แม้ว่าคำถามจะฟังดูกว้าง แต่ความจริงก็คือมีสถานการณ์ที่เฉพาะเจาะจงมากเมื่อforลูปมักจะดีกว่าการวนซ้ำตามอัตภาพ โพสต์นี้มีจุดมุ่งหมายเพื่อจับภาพนี้สำหรับลูกหลาน

7
Pythonic ใช้ความเข้าใจรายการเพื่อผลข้างเคียงหรือไม่?
ลองนึกถึงฟังก์ชันที่ฉันเรียกหาผลข้างเคียงไม่ใช่คืนค่า (เช่นการพิมพ์ไปที่หน้าจอการอัปเดต GUI การพิมพ์ไปยังไฟล์ ฯลฯ ) def fun_with_side_effects(x): ...side effects... return y ตอนนี้Pythonicใช้ความเข้าใจในรายการเพื่อเรียกสิ่งนี้ว่า func หรือไม่: [fun_with_side_effects(x) for x in y if (...conditions...)] โปรดทราบว่าฉันไม่ได้บันทึกรายการไว้ที่ใดเลย หรือฉันควรเรียกสิ่งนี้ว่า func แบบนี้: for x in y: if (...conditions...): fun_with_side_effects(x) ไหนดีกว่ากันและทำไม?

4
แสดงรายการความเข้าใจด้วยคำสั่ง if
ฉันต้องการเปรียบเทียบ 2 รายการซ้ำและพิมพ์รายการที่ปรากฏในทั้งสองรายการ >>> a = ('q', 'r') >>> b = ('q') # Iterate over a. If y not in b, print y. # I want to see ['r'] printed. >>> print([ y if y not in b for y in a]) ^ แต่มันทำให้ฉันมีข้อผิดพลาดทางไวยากรณ์ที่ไม่ถูกต้องที่^วางไว้ ฟังก์ชัน lamba นี้มีข้อผิดพลาดอย่างไร

6
วิธีการเฟรมสองสำหรับลูปใน python ความเข้าใจรายการ
ฉันมีสองรายการดังต่อไปนี้ tags = [u'man', u'you', u'are', u'awesome'] entries = [[u'man', u'thats'],[ u'right',u'awesome']] ฉันต้องการแยกรายการจากentriesเมื่ออยู่ในtags: result = [] for tag in tags: for entry in entries: if tag in entry: result.extend(entry) ฉันจะเขียนสองลูปเป็นความเข้าใจรายการบรรทัดเดียวได้อย่างไร

3
ความต่อเนื่องของบรรทัดสำหรับการทำความเข้าใจรายการหรือนิพจน์ตัวสร้างใน python
คุณควรจะแยกความเข้าใจในรายการที่ยาวมากได้อย่างไร? [something_that_is_pretty_long for something_that_is_pretty_long in somethings_that_are_pretty_long] ฉันยังเคยเห็นที่ไหนสักแห่งที่คนที่ไม่ชอบใช้ '\' เพื่อแบ่งสาย แต่ไม่เคยเข้าใจว่าทำไม เหตุผลเบื้องหลังนี้คืออะไร?

3
ในความเข้าใจรายการ Python สามารถเข้าถึงดัชนีรายการได้หรือไม่
พิจารณารหัส Python ต่อไปนี้ซึ่งฉันเพิ่มในรายการใหม่list2ทั้งหมดที่มีดัชนีตั้งแต่ 1 ถึง 3 ของlist1: for ind, obj in enumerate(list1): if 4 > ind > 0: list2.append(obj) คุณจะเขียนสิ่งนี้โดยใช้ความเข้าใจรายการได้อย่างไรถ้าฉันไม่สามารถเข้าถึงดัชนีผ่านการแจงนับได้ สิ่งที่ต้องการ: list2 = [x for x in list1 if 4 > ind > 0] แต่เนื่องจากฉันไม่มีindเบอร์นี่จะใช้ได้ไหม list2 = [x for x in enumerate(list1) if 4 > ind > 0]


6
ความเข้าใจในรายการ: ส่งคืนสองรายการ (หรือมากกว่า) สำหรับแต่ละรายการ
เป็นไปได้ไหมที่จะส่งคืน 2 รายการ (หรือมากกว่า) สำหรับแต่ละรายการในความเข้าใจรายการ สิ่งที่ฉันต้องการ (ตัวอย่าง): [f(x), g(x) for x in range(n)] ควรกลับ [f(0), g(0), f(1), g(1), ..., f(n-1), g(n-1)] ดังนั้นสิ่งที่จะแทนที่รหัสบล็อกนี้: result = list() for x in range(n): result.add(f(x)) result.add(g(x))

3
backticks มีความหมายอย่างไรกับตัวแปล python: "num"
ฉันกำลังเล่นกับความเข้าใจในรายการและฉันเจอตัวอย่างข้อมูลเล็ก ๆ น้อย ๆ นี้ในเว็บไซต์อื่น: return ''.join([`num` for num in xrange(loop_count)]) ฉันใช้เวลาสองสามนาทีในการพยายามจำลองฟังก์ชัน (โดยการพิมพ์) ก่อนที่จะรู้ว่า`num`บิตนั้นพัง การปิดคำสั่งในอักขระเหล่านั้นทำอะไร? จากสิ่งที่ฉันเห็นมันเทียบเท่ากับ str (num) แต่เมื่อฉันหมดเวลา: return ''.join([str(num) for num in xrange(10000000)]) ใช้เวลา 4.09 วินาทีในขณะที่: return ''.join([`num` for num in xrange(10000000)]) ใช้เวลา 2.43 วินาที ทั้งสองให้ผลลัพธ์ที่เหมือนกัน แต่อย่างใดอย่างหนึ่งช้ากว่ามาก เกิดขึ้นที่นี่คืออะไร? แก้ไข:ผิดปกติ ... repr()ให้ผลลัพธ์ช้ากว่า`num`. 2.99s เทียบกับ 2.43s ใช้ Python 2.6 (ยังไม่ได้ลอง …

10
ฉันจะหลีกเลี่ยงการประกาศตัวแปรที่ไม่ได้ใช้ใน for loop ได้อย่างไร
หากฉันมีความเข้าใจในรายการ (ตัวอย่าง) เช่นนี้: ['' for x in myList] สร้างรายการใหม่ที่มีสตริงว่างสำหรับทุกองค์ประกอบในรายการได้อย่างมีประสิทธิภาพฉันไม่เคยใช้x. มีวิธีเขียนที่สะอาดกว่านี้หรือไม่โดยที่ฉันไม่ต้องประกาศxตัวแปรที่ไม่ได้ใช้

3
ซ้อนสำหรับลูปโดยใช้ความเข้าใจรายการ
ถ้าฉันมีสองสาย'abc'และ'def'ฉันสามารถหาชุดค่าผสมทั้งหมดได้โดยใช้สองสายสำหรับลูป: for j in s1: for k in s2: print(j, k) อย่างไรก็ตามฉันต้องการดำเนินการนี้โดยใช้ความเข้าใจในรายการ ฉันลองมาหลายวิธีแล้ว แต่ไม่เคยได้รับเลย ไม่มีใครรู้วิธีการทำเช่นนี้?

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