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

时间:2018-02-14 19:02:23

标签: python

我有一个元组列表。我想摆脱前两个字符和所有第一个元组元素的最后一个字符。

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'并且'已从每个第一个元组元素中删除)

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

尝试下面但得到了TypeError:' tuple'对象不可调用

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

3 个答案:

答案 0 :(得分:2)

我同意@ 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)

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

答案 1 :(得分:1)

只需要一点列表理解:

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

答案 2 :(得分:0)

您错误地使用了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)
相关问题