TypeError: ลำดับรายการ 0: พบกับสตริงพบ int


188

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

def _db_inserts(dbinfo):
    try:
        rows = dbinfo['datarows']

        for row in rows:
            field_names = ",".join(["'{0}'".format(x) for x in row.keys()])
            value_list = row.values()

            for pos, value in enumerate(value_list):
                if isinstance(value, str):
                    value_list[pos] = "'{0}'".format(value)
                elif isinstance(value, datetime):
                    value_list[pos] = "'{0}'".format(value.strftime('%Y-%m-%d'))

            values = ",".join(value_list)

            sql = "INSERT INTO table_foobar ({0}) VALUES ({1})".format(field_names, values)

    except Exception as e:
        print 'BARFED with msg:',e

เมื่อฉันเรียกใช้อัลโกโดยใช้ข้อมูลตัวอย่าง (ดูด้านล่าง) ฉันได้รับข้อผิดพลาด:

TypeError: ลำดับรายการ 0: พบกับสตริงพบ int

ตัวอย่างของข้อมูล value_list ที่ให้ข้อผิดพลาดด้านบนคือ:

value_list = [377, -99999, -99999, 'f', -99999, -99999, -99999, 1108.0999999999999, 0, 'f', -99999, 0, 'f', -99999, 'f', -99999, 1108.0999999999999, -99999, 'f', -99999, 'f', -99999, 'f', 'f', 0, 1108.0999999999999, -99999, -99999, 'f', 'f', 'f', -99999, 'f', '1984-04-02', -99999, 'f', -99999, 'f', 1108.0999999999999] 

ผมทำอะไรผิดหรือเปล่า?


42
values = ",".join(map(str, value_list))
จิตวิญญาณ

คำตอบ:


383

string.join เชื่อมต่อองค์ประกอบภายในรายการของสตริงไม่ใช่ ints

ใช้นิพจน์ตัวสร้างนี้แทน:

values = ','.join(str(v) for v in value_list)

32
ยังสามารถใช้.join(map(str, value_list))
BallpointBen

44

แม้ว่าคำตอบที่เข้าใจได้ / รายการกำเนิดที่ได้รับก็โอเค แต่ฉันพบว่าอ่านและเข้าใจได้ง่ายขึ้น:

values = ','.join(map(str, value_list))

2
รักการใช้งานแผนที่และ str ฉันจะใช้รูปแบบนี้ต่อไป :)
ทิโมธีซีควินน์

17

แทนที่

values = ",".join(value_list)

กับ

values = ','.join([str(i) for i in value_list])

หรือ

values = ','.join(str(value_list)[1:-1])

1
อีกอันหนึ่ง values = ','.join(str(value_list)[1:-1])
Priyank Patel

4
ลบ[, ]จากตัวอย่างที่สองของคุณความเข้าใจรายการไม่จำเป็นต้องใช้และโดยการเอาพวกเขาที่คุณมีเครื่องกำเนิดไฟฟ้าซึ่งมีประสิทธิภาพมากขึ้น
jamylak

3
จริงตามที่อธิบายไว้ในstackoverflow.com/questions/9060653/...ใช้รายการแทนของเครื่องกำเนิดไฟฟ้าในstr.join()วิธีการได้เร็วขึ้น ...
dtheodor

12

คำตอบโดยcvalและPriyank Patelทำได้ดีมาก อย่างไรก็ตามทราบว่าค่าบางอย่างอาจจะเป็นสตริง Unicode และดังนั้นจึงอาจจะทำให้strจะโยนUnicodeEncodeErrorข้อผิดพลาด ในกรณีที่เปลี่ยนฟังก์ชั่นโดยฟังก์ชั่นstrunicode

ตัวอย่างเช่นสมมติว่าสตริงLibië (ภาษาดัตช์สำหรับลิเบีย) แสดงเป็น Python เป็นสตริง Unicode u'Libi\xeb':

print str(u'Libi\xeb')

พ่นข้อผิดพลาดต่อไปนี้:

Traceback (most recent call last):
  File "/Users/tomasz/Python/MA-CIW-Scriptie/RecreateTweets.py", line 21, in <module>
    print str(u'Libi\xeb')
UnicodeEncodeError: 'ascii' codec can't encode character u'\xeb' in position 4: ordinal not in range(128)

อย่างไรก็ตามบรรทัดต่อไปนี้จะไม่เกิดข้อผิดพลาด:

print unicode(u'Libi\xeb') # prints Libië

ดังนั้นแทนที่:

values = ','.join([str(i) for i in value_list])

โดย

values = ','.join([unicode(i) for i in value_list])

เพื่อความปลอดภัย.


1
นี่คือทางออกที่ดีที่สุดที่นี่! values ​​= ','. join ([unicode (i) สำหรับ i ใน value_list]) ที่ใช้งานได้ในกรณีที่คุณมีจำนวนเต็มและสตริงที่ผสมด้วยอักขระ ascii แบบขยาย
เมล

ไม่มีปัญหาใน Python3 อีกต่อไปstr('\xeb')=>ë
Brayoni


0

คุณสามารถแปลง dataframe จำนวนเต็มเป็นสตริงก่อนจากนั้นทำการดำเนินการเช่น

df3['nID']=df3['nID'].astype(str)
grp = df3.groupby('userID')['nID'].aggregate(lambda x: '->'.join(tuple(x)))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.