Python 从包含元组的列表中删除字符

Python 从包含元组的列表中删除字符,python,Python,我有一个元组列表。我想去掉所有第一个元组元素的前2个字符和最后一个字符 db=[("b'D967E735-070D-48F9-A3BB-D00766D39F57'", 'test1', '51-00401'), ("b'94F903D1-2EE7-4BD2-A0C6-B464D9F2939C'", 'Ddfsd_test4', '51-00404'), ("b'FE0CC34C-BA6A-4123-B72C-617ADC0A93E7'", 'Xdsfd_test10', '51-00409'

我有一个元组列表。我想去掉所有第一个元组元素的前2个字符和最后一个字符

db=[("b'D967E735-070D-48F9-A3BB-D00766D39F57'", 'test1', '51-00401'), 
("b'94F903D1-2EE7-4BD2-A0C6-B464D9F2939C'", 'Ddfsd_test4', '51-00404'), 
("b'FE0CC34C-BA6A-4123-B72C-617ADC0A93E7'", 'Xdsfd_test10', '51-00409'), 
("b'43996819-A615-4DC8-BB93-C4A54007FB34'", 'dsd', '51-00453'), 
("b'15D1B5DA-2E1D-4D86-9E53-60F3257D81E1'", 'dsd', '60-00400')]
它应该返回如下(b'和'已从每个第一个元组元素中删除)

已在下面尝试,但出现TypeError:“tuple”对象不可调用

for i in db:
   y=list(map(i[2:len(i[0])-1],i[0]))
print (y)

只是一点列表理解:

res = [((x[0][2:-1], x[1], x[2])) for x in db]

只是一点列表理解:

res = [((x[0][2:-1], x[1], x[2])) for x in db]

我同意@juanpa.arrivillaga的评论,如果可以修改函数的错误输出,应该修复它。但如果你不能,这个解决方案就行了

import ast

db=[("b'D967E735-070D-48F9-A3BB-D00766D39F57'", 'test1', '51-00401'), 
("b'94F903D1-2EE7-4BD2-A0C6-B464D9F2939C'", 'Ddfsd_test4', '51-00404'), 
("b'FE0CC34C-BA6A-4123-B72C-617ADC0A93E7'", 'Xdsfd_test10', '51-00409'), 
("b'43996819-A615-4DC8-BB93-C4A54007FB34'", 'dsd', '51-00453'), 
("b'15D1B5DA-2E1D-4D86-9E53-60F3257D81E1'", 'dsd', '60-00400')]

new_db = []

for thing, name, code in db:
    thing = ast.literal_eval(thing).decode()
    new_db.append((thing, name, code))

print(new_db)

基本上,此解决方案接受条目,将其作为字节对象读取(使用)。然后将其转换为字符串对象(使用)。我认为这是一个更自然的解决方案,而不仅仅是删除前两个字符和最后一个字符。

我同意@juanpa.arrivillaga的意见,如果可以修改函数的错误输出,应该修复它。但如果你不能,这个解决方案就行了

import ast

db=[("b'D967E735-070D-48F9-A3BB-D00766D39F57'", 'test1', '51-00401'), 
("b'94F903D1-2EE7-4BD2-A0C6-B464D9F2939C'", 'Ddfsd_test4', '51-00404'), 
("b'FE0CC34C-BA6A-4123-B72C-617ADC0A93E7'", 'Xdsfd_test10', '51-00409'), 
("b'43996819-A615-4DC8-BB93-C4A54007FB34'", 'dsd', '51-00453'), 
("b'15D1B5DA-2E1D-4D86-9E53-60F3257D81E1'", 'dsd', '60-00400')]

new_db = []

for thing, name, code in db:
    thing = ast.literal_eval(thing).decode()
    new_db.append((thing, name, code))

print(new_db)

基本上,此解决方案接受条目,将其作为字节对象读取(使用)。然后将其转换为字符串对象(使用)。我认为这是一个更自然的解决方案,而不仅仅是删除前两个字符和最后一个字符。

您使用的
map
不正确。第一个参数必须是函数或lambda
i[2:len(i[0])-1]
两者都不是。因此,您可以定义执行相同操作的函数,即:

def removeFirstAndLast(theString):
    return theString[2:len(theString[0])-1]
for i in db:
    y=list(removeFirstAndLast,i[0]))
print (y)
或者只使用内联lambda:

for i in db:
    y=list(map(lambda x: x[2:len(x[0])-1],i[0]))
print (y)

您正在错误地使用
map
。第一个参数必须是函数或lambda
i[2:len(i[0])-1]
两者都不是。因此,您可以定义执行相同操作的函数,即:

def removeFirstAndLast(theString):
    return theString[2:len(theString[0])-1]
for i in db:
    y=list(removeFirstAndLast,i[0]))
print (y)
或者只使用内联lambda:

for i in db:
    y=list(map(lambda x: x[2:len(x[0])-1],i[0]))
print (y)

你知道它为什么会写一个前缀吗?等等,像这样的:
“b'D967E735-070D-48F9-A3BB-D00766D39F57”是怎么产生的?它看起来像是有人在一个
bytes
对象上调用
str
。。。最好的解决办法是解决这个问题。你知道为什么它首先要写一个b前缀吗?它是数据库查询的返回值。您似乎不知道
map()
是如何工作的。你这样称呼它毫无意义。我同意前面的评论,您应该在上游某个地方解决这个问题,但是如果您将代码更改为:
y=map(lambda I:(I[0][2:-1],I[1],I[2]),db)
它应该可以工作。或者在列表理解中分解元组:y=[(x[0][2:len x[0]-1],x[1],x[2]),对于db中的x]你知道它为什么会写一个前缀吗?等等,像这样的:
“b'D967E735-070D-48F9-A3BB-D00766D39F57”是怎么产生的?它看起来像是有人在一个
bytes
对象上调用
str
。。。最好的解决办法是解决这个问题。你知道为什么它首先要写一个b前缀吗?它是数据库查询的返回值。您似乎不知道
map()
是如何工作的。你这样称呼它毫无意义。我同意前面的评论,您应该在上游某个地方解决这个问题,但是如果您将代码更改为:
y=map(lambda I:(I[0][2:-1],I[1],I[2]),db)
它应该会起作用。或者在列表理解中分解元组:y=[(x[0][2:len x[0]-1],x[1],x[2]),对于那些喜欢较少下标的人:
[(x])[2:-1],y,z)对于(x,y,z)在db中的形式,
对于那些喜欢较少下标的人:
[(x[2:-1],y,z)对于(x,y,z)在db中的形式,
很好。重要的是更明确地指出,遗漏的是有人调用了
str(thing)
,而不是
thing.decode()
上游的某个地方。OP最好寻找字节对象被转换为字符串的位置,并对其进行解码。很好。更明确地指出遗漏的是有人调用了
str(thing)
而不是
thing.decode()
上游的某个地方。建议OP查找将字节对象转换为字符串的位置,并对其进行解码。