我从sqlite3 select语句得到一个可迭代的元组,我想把这个可迭代的函数赋予一个期望字符串可迭代的函数。如何覆盖下一个函数来给出元组的第一个索引?或者更准确地说,这样做的正确方法是什么?
>>> res = conn.execute(query,(font,))
>>> train_counts = count_vect.fit_transform(res)
AttributeError: 'tuple' object has no attribute 'lower'
编辑:
由于映射涉及遍历整个列表,因此只需要像Niklas提供的那样构建生成器所需的时间的两倍。
first = """
l = list()
for i in xrange(10):
l.append((i,))
for j in (i[0] for i in l):
j
"""
second = """
l = list()
for i in xrange(10):
l.append((i,))
convert_to_string = lambda t: "%d" % t
strings = map(convert_to_string, l)
for j in strings:
j
"""
third = """
l = list()
for i in xrange(10):
l.append((i,))
strings = [t[0] for t in l]
for j in strings:
j
"""
print "Niklas B. %f" % timeit.Timer(first).timeit()
print "Richard Fearn %f" % timeit.Timer(second).timeit()
print "Richard Fearn #2 %f" % timeit.Timer(third).timeit()
>>>
Niklas B. 4.744230
Richard Fearn 12.016272
Richard Fearn #2 12.041094
答案 0 :(得分:4)
您需要编写一个将每个元组转换为字符串的函数;然后你可以使用map
将元组序列转换为字符串序列。
例如:
# assume each tuple contains 3 integers
res = ((1,2,3), (4,5,6))
# converts a 3-integer tuple (x, y, z) to a string with the format "x-y-z"
convert_to_string = lambda t: "%d-%d-%d" % t
# convert each tuple to a string
strings = map(convert_to_string, res)
# call the same function as before, but with a sequence of strings
train_counts = count_vect.fit_transform(strings)
如果你想要每个元组的第一个项目,你的功能可能是:
convert_to_string = lambda t: t[0]
(假设第一个元素已经是一个字符串)。
实际上,在这种情况下,您可以完全避免使用lambda并使用列表解析:
strings = [t[0] for t in res]
答案 1 :(得分:2)
简单的解决方案是使用生成器表达式:
count_vect.fit_transform(t[0] for t in res)