0

ネストされたリストがあります。このリストでは、ネストされたすべてのリストに 2 つのコンポーネントが含まれ、各コンポーネントには空白 (' ') 文字が含まれる場合があります。コードを削除して書きたかったのですが、機能しませんでした。問題 ?

リストのネストされたリストは次のとおりです。

[['bike', '2 * wheel+1* frame'], ['wheel', '1  * rim + 1* spoke +1 *hub'], ['rim', 60], ['spoke', 120], ['hub', '2*gear+1*axle'], ['gear', 25], ['axle', '5*bolt+7*nut'],['bolt',0.1], ['nut', 0.15],['frame', '1*rearframe+ 1*frontframe'],['rearframe', 175],['frontframe', '1*fork+2*handle'], ['fork', 22.5],['handle', 10.0]]

見られるように、一部の文字列にはいくつかの空白があります。

私が書いたpythonコード:

def blanks(des):
    a = 0
    while a < len(des): 
        if type(des[0][1]) == str: 
            des[0][0] = des[0][0].replace(' ','')
        if type(des[0][1]) == str:
            des[0][1] = des[0][1].replace(' ','')
        a += 1

    return des 
4

5 に答える 5

1

for代わりにループを使用してください。

def blanks(lis):
    for i, _ in enumerate(lis):
        for j in range(2):
            if isinstance(lis[i][j], str):
                lis[i][j] = lis[i][j].replace(' ', '')
    return lis

リスト内包表記も同様に機能します。

def blanks(lis):
    return [i.replace(' ', '') if isinstance(i, str) else i for a in lis for i in a]

または、関数定義なしで:

lis = [[i.replace(' ', '') if isinstance(i, str) else i for i in a] for a in lis]

これはあなたが望むことをするべきだと思います。ただし、ネストされたリストの深さが一貫していない場合は、ジェネレーター関数を使用することをお勧めします。

def blanks(lis):
    for i, el in enumerate(lis):
        if isinstance(el, list):
            blanks(el)
        elif isinstance(el, str):
            yield el.replace(' ', '')
        else:
            yield el

コードの最後の部分の詳細については、この回答も参照してください。

于 2013-01-12T09:29:04.453 に答える
0

制限や固定パラメーターがないため、問題を解決するには少し再帰を使用する必要があります。

def trimSpaces(list):
  for i in range(0,len(list)):
    if type(list[i]) == str:
      list[i] = list[i].replace(' ','')
    elif type(list[i]) == type([]):
      list[i] = trimSpaces(list[i])
    else:
      continue
  return list
于 2013-01-12T09:34:28.700 に答える
0

これは 1 つの方法です。

map(lambda x:map(lambda y:y.replace(' ','') if isinstance(y,str) else y,x),a)

whereaは、渡す入力リストです。

于 2013-01-12T09:30:42.133 に答える
0

これを試して:

def removeBlanks(input):

  if type(input) is list:
    ret=[]
    for i in input:
      ret.append(removeBlanks(i))
  else:
    ret=input.replace(" ", "")

  return ret   
于 2013-01-12T09:41:01.070 に答える
0

Python では、通常、次のように入力を事前検証する代わりに、EAFP に従って例外をキャッチしますisinstance

def no_blanks(s):
    try:
        return s.replace(' ', '')
    except AttributeError:
        return s

ls = [['bike', '2 * wheel+1* frame'], ['wheel', '1  * rim + 1* spoke +1 *hub'], ['rim', 60], ['spoke', 120], ['hub', '2*gear+1*axle'], ['gear', 25], ['axle', '5*bolt+7*nut'],['bolt',0.1], ['nut', 0.15],['frame', '1*rearframe+ 1*frontframe'],['rearframe', 175],['frontframe', '1*fork+2*handle'], ['fork', 22.5],['handle', 10.0]]

new_ls = [[no_blanks(a), no_blanks(b)] for a, b in ls]

dictまた、あなたのリストをよく見ると、あなたのデータにとっておそらくより良い選択であるように思えます.

于 2013-01-12T10:23:38.243 に答える