2012-01-04 11 views
2

整数と複数の文字列を持つ入れ子リストを含む一連のリストがあります。目標は、文字列を1つの文字列に結合することです。私は1つのリストで動作するコードでこれを達成しました。問題は、一連のリストを繰り返し処理しようとするとエラーが発生することです。「TypeError:シーケンスアイテム0:期待される文字列intが見つかりました」整数を文字列に変更しようとしました。整数である項目を無視して、コードをネストされたリストに直接渡します。シリーズのPython 2.7.2で一連のネストされたリストの文字列を結合する

例:

[19497, ['83', 'CLM']] 
    [19498, ['80', 'COS', 'PAN', '83', 'CLM']] 
    [19505, ['79', 'MXE', 'MXN', 'MXS']] 
    [19507, ['83', 'CLM', 'ECU']] 
    [19509, ['79', 'MXG', 'MXS', 'MXT', '80', 'BLZ', 'GUA', 'HON', 'NIC']] 

これは、1つのリストのために働く:

>>> q = [48, ['40', 'ASS', 'EHM', 'IND', 'NEP', 'WHM', '41', 'MYA']] 
    >>> q[1] = " ".join(q[1]) 
    >>> q 
    [48, '40 ASS EHM IND NEP WHM 41 MYA'] 

これは、私は繰り返しのためにしようとしたものですと型エラーを取得します。

def smush(q): 
     '''STILL IN PROGRESS: Trying to create single string in nested list.''' 
     for line in q: 
      q[1] = ' '.join(q[1]) 
     return q 

私はこの単純な解決策があると私は見落としました。提案?

ご協力いただきありがとうございます。

+0

、それはすべきではない 'ライン[1]'の代わりに[1] ''がどんな() ''でqは?さもなければ、あなたがやろうとしていることはまったく明確ではありません: 'smush()'の 'q'の値は何ですか?そして結果は何でしょうか? – millimoose

答えて

1

あなたは本当に近いです:、すべての項目が正確に二つの要素のリストである場合は、代わりにtuplesを使用する必要があります

def smush(lists): 
    for line in lists: 
     line[1] = ' '.join(line[1]) 
    return lists # optional, since this modifies the list in-place 

次のように:

data = [  
    (19497, ['83', 'CLM']), 
    (19498, ['80', 'COS', 'PAN', '83', 'CLM']), 
    (19505, ['79', 'MXE', 'MXN', 'MXS']), 
    (19507, ['83', 'CLM', 'ECU']), 
    (19509, ['79', 'MXG', 'MXS', 'MXT', '80', 'BLZ', 'GUA', 'HON', 'NIC']), 
] 

dataInStringFormat = [(n, ''.join(l)) for n,l in data] 
+1

'smush(lst)'が 'lst'をインプレースで変更した場合、おそらく' None'を返すべきです。 – jfs

-1

私はあなたが持っていると仮定しています次のようなリストのネストされたリスト:

x = [[19497, ['83', 'CLM']], 
[19498, ['80', 'COS', 'PAN', '83', 'CLM']], 
[19505, ['79', 'MXE', 'MXN', 'MXS']], 
[19507, ['83', 'CLM', 'ECU']], 
[19509, ['79', 'MXG', 'MXS', 'MXT', '80', 'BLZ', 'GUA', 'HON', 'NIC']]] 

この場合は、次のように反復処理する必要があります。

for li in x: 
    smush(li) 
    print(li) 
+1

元の 'smush(lists)'メソッドがすでにリストのコレクション全体を反復処理していることを考慮すると、別の時間を繰り返す必要はありません。代わりに個々の要素を迷惑にしてしまうでしょう。 – Makoto

+0

これは、リストのネストされたリストであると仮定した理由です。私が上記に投稿したものに対して 'smush(x) 'を直接使用しようとすると、' TypeError:シーケンス項目0:期待文字列、int found'が返されます。 – Yuushi

0

ここだけ(任意のエラー処理なしで)動作するものです。

lines = [ 
    [19497, ['83', 'CLM']], 
    [19498, ['80', 'COS', 'PAN', '83', 'CLM']], 
    [19505, ['79', 'MXE', 'MXN', 'MXS']], 
] 

def smush(lines): 
    new_lines = [] 
    for line in lines: 
     new_line = [line[0], ' '.join(line[-1])] 
     new_lines.append(new_line) 
    return new_lines 

print smush(lines) 
# [[19497, '83 CLM'], [19498, '80 COS PAN 83 CLM'], [19505, '79 MXE MXN MXS']] 
0

list comprehensionは簡潔にあなたがやりたいことになります。

a = [[19497, ['83', 'CLM']], 
    [19498, ['80', 'COS', 'PAN', '83', 'CLM']], 
    [19505, ['79', 'MXE', 'MXN', 'MXS']], 
    [19507, ['83', 'CLM', 'ECU']], 
    [19509, ['79', 'MXG', 'MXS', 'MXT', '80', 'BLZ', 'GUA', 'HON', 'NIC']]] 

def smush(q): 
    '''Implemented as a list comprehension.''' 
    return [[x[0], ' '.join(x[1])] for x in q] 

だからaは、ネストされたように定義された仮定上記のリストの場合、smushに渡されると返されます:

In [1]: smush(a) 
Out[1]: 
[[19497, '83 CLM'], 
[19498, '80 COS PAN 83 CLM'], 
[19505, '79 MXE MXN MXS'], 
[19507, '83 CLM ECU'], 
[19509, '79 MXG MXS MXT 80 BLZ GUA HON NIC']] 

PEP 202に記載されているように:

List comprehensions provide a more concise way to create lists in situations where map() and filter() and/or nested loops would currently be used.

関連する問題