3

sqlite3 select ステートメントの結果としてタプルの iterable を取得しています。文字列の iterable を期待する関数に、この iterable を与えたいと考えています。次の関数をオーバーライドして、タプルの最初のインデックスを取得するにはどうすればよいですか? または、より正確に言うと、これを行う正しいpythonicの方法は何ですか?

>>> res = conn.execute(query,(font,))
>>> train_counts = count_vect.fit_transform(res)

AttributeError: 'tuple' object has no attribute 'lower'

編集:

マッピングにはリスト全体の反復が含まれるため、Niklas が提供したジェネレーターを構築するだけの場合の 2 倍の時間がかかります。

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
4

2 に答える 2

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]

(最初の要素がすでに文字列であると仮定します)。

実際には、ラムダを完全に回避してリスト内包表記を使用できます。

strings = [t[0] for t in res]
于 2012-05-12T12:33:29.940 に答える
2

簡単な解決策は、ジェネレーター式を使用することです。

count_vect.fit_transform(t[0] for t in res)
于 2012-05-12T13:09:42.250 に答える