私はこのような入力をしています:
['Assembly', '', 'py', 'tho', 'n', '', 'ja', 'va', '', 'rub', 'y', '', 'Java', 'script', '', 'c++']
''
間で要素を結合して、次のような出力を作成します。
['Assembly', 'python', 'Java', 'Ruby', 'javascript', 'c++']
私はjoin
を使って、次のようにリストのスライスを試みました:
a=['Assembly', '', 'py', 'tho', 'n', '', 'ja', 'va', '', 'rub', 'y', '', 'Java', 'script', '', 'c++']
a[2:5] = [''.join(a[ 2: 5])]
a=['Assembly', '', 'python', '', 'ja', 'va', '', 'rub', 'y', '', 'Java', 'script', '', 'c++']
これはある程度機能しますが、リスト全体に対してこの命令を反復する方法がわかりません。
from itertools import groupby
l = ['Assembly', '', 'py', 'tho', 'n', '', 'ja', 'va', '', 'rub', 'y', '', 'Java', 'script', '', 'c++']
new_l = [''.join(g) for k, g in groupby(l, key = bool) if k]
出力:
['Assembly', 'python', 'Java', 'Ruby', 'javascript', 'c++']
これはひどいとハックですが、
lambda b:lambda l:''.join(i or b for i in l).split(b)
リストの連結に含まれていないことを保証できる任意の文字列を取り、必要な機能を実行する関数を返すことができます。もちろん、特定の状況でこれを1回または2回だけ使用したい場合があるため、リストのどの要素にもスペースが含まれていないことを保証できる場合は、次のようになります。
a = ['Assembly', '', 'py', 'tho', 'n', '', 'ja', 'va', '', 'rub', 'y', '', 'Java', 'script', '', 'c++']
a = ''.join(i or ' ' for i in a).split(' ')
Itertoolsを使用できない、または使用したくない場合:
l = ['Assembly', '', 'py', 'tho', 'n', '', 'ja', 'va', '', 'rub', 'y', '', 'Java', 'script', '', 'c++']
l_new = []
combined = ""
for idx, s in enumerate(l):
if s != "":
combined += s
if idx == len(l)-1:
l_new.append(combined)
else:
l_new.append(combined)
combined = ""
あなたはこれを行うことができます:
a = ['Assembly', '', 'py', 'tho', 'n', '', 'ja', 'va', '', 'rub', 'y', '', 'Java', 'script', '', 'c++']
indx = ['' == k for k in a]
indx = [i for i, x in enumerate(indx) if x] # get the indices.
a_merged = a[0:indx[0]] + [''.join(a[indx[i]:indx[i+1]]) for i in range(len(indx)) if i < len(indx)-1] + a[indx[-1]+1:] # merge the list
出力:
['Assembly', 'python', 'Java', 'Ruby', 'javascript', 'c++']
コメントの後に編集:
a = ['Assembly', '','', 'py', 'tho', 'n', '', 'ja', 'va', '', 'rub', 'y', '', 'Java', 'script', '', 'c++']
indx = [i for i, x in enumerate(a) if x == ''] # get the indices where '' occurs in the original list.
a_merged = a[0:indx[0]] + [''.join(a[indx[i]:indx[i+1]]) for i in range(len(indx)) if i < len(indx)-1 and indx[i+1] -indx[i] > 1] + a[indx[-1]+1:]
a_merged
出力:
['Assembly', 'python', 'Java', 'Ruby', 'javascript', 'c++']
入力区切り文字が実際には空の文字列である場合、次のことができます
strlist = [x or ' ' for x in a]
joined = ''.join(strlist).split()
joined
['Assembly', 'python', 'Java', 'Ruby', 'javascript', 'c++']
Cris回答ほとんどのpythonアプローチを使用することに同意しますですが、Crisの回答を少し調整するとよいでしょう。 groupby(l,key = bool)
を使用してgroupby(l, key = lambda x: x !='')
を使用する代わりに、不要なあいまいさを取り除く
from itertools import groupby
separator = ''
l = ['Assembly', '', 'py', 'tho', 'n', '', 'ja', 'va', '', 'rub', 'y', '', 'Java', 'script', '', 'c++']
new_l = [''.join(g) for k, g in groupby(l, key = lambda x: x !=separator) if k]
The Zen of Python で述べられているように、Explicitは暗黙よりも優れています
PS-にコメントを書くのに十分な評判がないため、私は新しい答えのみを書いています。 Cris答え。
かなり古いですが、まだ便利です:
from itertools import groupby
lst = ['Assembly', '', 'py', 'tho', 'n', '', 'ja', 'va', '', 'rub', 'y', '', 'Java', 'script', '', 'c++']
new_lst = [''.join(values)
for key, values in groupby(lst, key = lambda x: x == '')
if not key]
print(new_lst)
これは
['Assembly', 'python', 'Java', 'Ruby', 'javascript', 'c++']
基本的なループ/テストのみを備えた別の動作バージョン:
txt = ['Assembly', '', 'py', 'tho', 'n', '', 'ja', 'va', '', 'rub', 'y', '', 'Java', 'script', '', 'c++']
out = []
temp = ''
for s in txt:
if s == '':
if temp != '':
out.append(temp)
temp = ''
out.append('')
else:
temp = temp + s
if temp != '':
out.append(temp)
out
リストに対してループを実行する
ループ内で一時的な空の文字列に要素を追加し、要素が空の文字列であるか、リストの最後の要素であるかを確認します。trueの場合、一時変数を出力リストに追加し、値を変更しますその変数を空の文字列に
コード:
x=['Assembly', '', 'py', 'tho', 'n', '', 'ja', 'va', '', 'rub', 'y', '', 'Java', 'script', '', 'c++']
temp=''
output=[]
for y in x:
temp=temp+y
if y=='' or y==x[-1]:
output.append(temp)
temp=''
print(output)
出力:['Assembly', 'python', 'Java', 'Ruby', 'javascript', 'c++']