web-dev-qa-db-ja.com

リストの要素が2つの空白の間にある場合にそれらを結合する

私はこのような入力をしています:

['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++']

これはある程度機能しますが、リスト全体に対してこの命令を反復する方法がわかりません。

24
mewtire

itertools.groupby

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++']
27
Chris

これはひどいとハックですが、

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(' ')
7

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 = ""
4
Asad

あなたはこれを行うことができます:

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++']
3
naive

入力区切り文字が実際には空の文字列である場合、次のことができます

strlist = [x or ' ' for x in a]
joined = ''.join(strlist).split()
joined
['Assembly', 'python', 'Java', 'Ruby', 'javascript', 'c++']
2
realgeek

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答え。

1
N.Nonkovic

かなり古いですが、まだ便利です:

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++']
1
Jan

基本的なループ/テストのみを備えた別の動作バージョン:

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
1
B. Go

リストに対してループを実行する
ループ内で一時的な空の文字列に要素を追加し、要素が空の文字列であるか、リストの最後の要素であるかを確認します。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++']

1
Eswar