2016-08-24 11 views
0

タイトルは、私が達成しようとしているものを正確に記述する適切なヘッダーを思い付くほど賢明ではないので、少し誤解を招くので、謝ります。うまくいけば、私は以下の説明でこれを補うことができます。リストのリストで2つの文字列を連結する

他の操作を実行するには、少しクリーンアップが必要な本の演習に取り組んでいます。私はリストのリストを持っていますいくつかこれらのリストのすべてではなく、連結による更新が必要です。良く説明するために、ここではリストのリストからスライスがある:

[['e726fb69de83a3ec', 'General_Mobile', 'Android', 'unknown', '0'], 
['1b8978f618d59eef', 'General_Mobile', 'iOS', 'unknown', '0'], 
['8ee82ed6c2c5af59', 'General_Desktop', 'Windows', 'XP', 'male', '29'], 
['d0fff09ca1829e65', 'General_Mobile', 'Android', 'female', '48'], 
['3126deccaae39ea1', 'General_Desktop', 'Windows', 'XP', 'male', '24'], 
['6778d882a1f59b5b', 'General_Mobile', 'iOS', 'female', '25']] 

各リストの要素はそれぞれ、ユーザーID、デバイス、OS、性別やprovinceIDに対応しています。 3番目と5番目のリストを見れば、これは私のジレンマが発生する場所です - 「Windows」と「XP」が別々の文字列であることに気づくでしょう。上記の残りのリストは、この問題から免除されている

['8ee82ed6c2c5af59', 'General_Desktop', 'Windows XP', 'male', '29'] 
['3126deccaae39ea1', 'General_Desktop', 'Windows XP', 'male', '24'] 

ので、それらを変更する必要はありません:」、なるように、これら2つの文字列が他の中、それぞれのリストに表示されます。

私は、このような分離を持つリストで2つの文字列を結合することができるいくつかの妥当な手段を開発しようとしました(上記の例では表示されていない他のリスト'' Windows 7 ''の代わりに '' 7 '')が、まだ私はそうしている。これを行うための「きれいな」方法がありますか、またはこれらの文字列を削除して2つの連結を挿入するループを作成する必要がありますか?

+0

は ' 'Android''と'' unknown''は ' 'アンドロイドunknown''に連結されることになっていますか? –

+1

@JohnColeman私はそれが未知の性別であると推測していました... –

+0

あなたが実際のソースデータを提供するリスト例か、それともあなたが行った処理が投稿されていますか? –

答えて

0

特定のケースでは、常に問題の可能性があるプラットフォームであれば、リストに項目が多すぎるかどうかを確認できます。そうであれば、2番目と3番目のインデックスに項目を結合します。しかし、もっと広い解決策が必要な場合は、問題を明確にしてください。

NUM_ITEMS_PER_LIST = 5 
lists = [ 
    ['e726fb69de83a3ec', 'General_Mobile', 'Android', 'unknown', '0'], 
    ['1b8978f618d59eef', 'General_Mobile', 'iOS', 'unknown', '0'], 
    ['8ee82ed6c2c5af59', 'General_Desktop', 'Windows', 'XP', 'male', '29'], 
    ['d0fff09ca1829e65', 'General_Mobile', 'Android', 'female', '48'], 
    ['3126deccaae39ea1', 'General_Desktop', 'Windows', 'XP', 'male', '24'], 
    ['6778d882a1f59b5b', 'General_Mobile', 'iOS', 'female', '25'] 
] 

for l in lists: 
    if len(l) > NUM_ITEMS_PER_LIST: 
     l[2] = '{} {}'.format(l[2], l[3]) 
     del l[3] 

print(lists) 

出力

[ 
    ['e726fb69de83a3ec', 'General_Mobile', 'Android', 'unknown', '0'], 
    ['1b8978f618d59eef', 'General_Mobile', 'iOS', 'unknown', '0'], 
    ['8ee82ed6c2c5af59', 'General_Desktop', 'Windows XP', 'male', '29'], 
    ['d0fff09ca1829e65', 'General_Mobile', 'Android', 'female', '48'], 
    ['3126deccaae39ea1', 'General_Desktop', 'Windows XP', 'male', '24'], 
    ['6778d882a1f59b5b', 'General_Mobile', 'iOS', 'female', '25'] 
] 
2

あなたは単純なリストの内包表記を使用できます。

>>> data = [['e726fb69de83a3ec', 'General_Mobile', 'Android', 'unknown', '0'], 
['1b8978f618d59eef', 'General_Mobile', 'iOS', 'unknown', '0'], 
['8ee82ed6c2c5af59', 'General_Desktop', 'Windows', 'XP', 'male', '29'], 
['d0fff09ca1829e65', 'General_Mobile', 'Android', 'female', '48'], 
['3126deccaae39ea1', 'General_Desktop', 'Windows', 'XP', 'male', '24'], 
['6778d882a1f59b5b', 'General_Mobile', 'iOS', 'female', '25']] 

、その後:

>>> [item if len(item) == 5 else item[:2] + [' '.join(item[2:4])] + item[4:] for item in data] 
[['e726fb69de83a3ec', 'General_Mobile', 'Android', 'unknown', '0'], ['1b8978f618d59eef', 'General_Mobile', 'iOS', 'unknown', '0'], ['8ee82ed6c2c5af59', 'General_Desktop', 'Windows XP', 'male', '29'], ['d0fff09ca1829e65', 'General_Mobile', 'Android', 'female', '48'], ['3126deccaae39ea1', 'General_Desktop', 'Windows XP', 'male', '24'], ['6778d882a1f59b5b', 'General_Mobile', 'iOS', 'female', '25']] 
+0

また、最初と最後の2つのカラムがうまくいっていると言えるのであれば、これをもう少し一般的にすることができます: '[el [:2] + ['' .join(el [2: -2])] + el [-2:] for data in '(絶対オフセットを扱っていない場合は、iffy領域が既知の良い領域の間にあることを絞り込むことができます。コードがシンプルになり、長さのチェックを取り除くことができます) –

+0

@JohnColemanこれは美しく動作します!どうもありがとうございました! – erik7970

0

使用を:

mylist = [['e726fb69de83a3ec', 'General_Mobile', 'Android', 'unknown', '0'], ['1b8978f618d59eef', 'General_Mobile', 'iOS', 'unknown', '0'], ['8ee82ed6c2c5af59', 'General_Desktop', 'Windows', 'XP', 'male', '29'], ['d0fff09ca1829e65', 'General_Mobile', 'Android', 'female', '48'], ['3126deccaae39ea1', 'General_Desktop', 'Windows', 'XP', 'male', '24'], ['6778d882a1f59b5b', 'General_Mobile', 'iOS', 'female', '25']] 

map(lambda x: x[:2]+[" ".join(x[2:4])]+x[4:] if len(x) == 6 else x, mylist) 

出力:

[['e726fb69de83a3ec', 'General_Mobile', 'Android', 'unknown', '0'], 
['1b8978f618d59eef', 'General_Mobile', 'iOS', 'unknown', '0'], 
['8ee82ed6c2c5af59', 'General_Desktop', 'Windows XP', 'male', '29'], 
['d0fff09ca1829e65', 'General_Mobile', 'Android', 'female', '48'], 
['3126deccaae39ea1', 'General_Desktop', 'Windows XP', 'male', '24'], 
['6778d882a1f59b5b', 'General_Mobile', 'iOS', 'female', '25']] 
関連する問題