8

これはフォームの例です。後で言葉で説明します。文字列を分割したリストがあります...

いう

[a, a, a, b, a, a, b, a, c, a, b, a, a, c, a, c, a]

ここで、b は基準 1、c は基準 2 です。

次のようなリストに分割したいと思います。

[a, a, a, [b, a, a, [b, a, c], a, [b, a, a, c], a, c], a]

そのため、文字列を処理して、項目が条件 1 に一致する場合は新しいリストを開き、項目が条件 2 に一致する場合はリストを閉じて 1 つ上のレベルを返すようにしたいと考えています。

私はこのようなことをしようとしましたが、うまくいきません。

def sublist(self, l):
  for line in list:
    if not b:
    self.data.append(line)
  else:
    sublist(l[line:])       #<-----  not sure how to recurse it.

stackoverflow の前に、リストを同じサイズのリストに分割するのを見たことがありますが、一連の基準を使用してサブリストに分割するものはありません。

私は Python にかなり慣れていないので、データ構造とイテレータ ツールにあまり詳しくありません。

4

7 に答える 7

10

どうぞ:

lst = "aaabaabacabaacaca"

def go(it):
    for x in it:
        if x == 'b':
            yield [x] + list(go(it))
        else:
            yield x
            if x == 'c':
                break 


print list(go(iter(lst)))
于 2012-05-02T14:42:09.590 に答える
1
addlist = []
alllists = []
for item in mylist:
    if item == b:
       newlist = [item]
       addlist.append(newlist)
       alllists.append(addlist)
       addlist = newlist
    elif item == c:
       addlist.append(item)
       addlist = alllists.pop()
    else:
       addlist.append(item)

b上記は、区切り文字とc区切り文字のバランスが取れている限り機能します。特に、cs を超過すると、スタック アンダーフローが発生します。

私はしばしば再帰的なソリューションを好みますが、これにはスタックを明示的にするという利点があります。この場合、私の意見では、コードを理解しやすくなります。

于 2012-05-02T14:33:39.127 に答える
1

スタックで:

def parseList(inList):
    stack = [[]]
    for element in inList:
        if element == 'b':
            stack.append([element])
            stack[-2].append(stack[-1])
        elif element == 'c':
            stack.pop().append(element)
        else:
            stack[-1].append(element)
    return stack[0]

これは、'b' よりも 'c' が多い場合に壊れます。

于 2012-05-02T15:06:46.987 に答える
0

実際の再帰スタイルでは、次のことができます。

x = yourlist
i = 0
def lets_parse():
    global i
    fnlist = []
    while i < len(x)
        if x[i] == 'c':
            fnlist.append(x[i])
            i += 1
        return fnlist
        elif x[i] == 'b':
            i += 1
            f = lets_parse()
            f.insert(0, 'b')
            fnlist.append(f)
        else:
            fnlist.append(x[i])
            i += 1
return fnlist

print lets_parse()

グローバルの使用に注意してください。多くの批評家は、コーディング スタイルが悪いと反対するかもしれません。

于 2012-05-02T16:10:06.497 に答える
0
import ast    
mylist = '[a, a, a, b, a, a, b, a, c, a, b, a, a, c, a, c, a]'
mylist = mylist.replace('a','"a"')
mylist = mylist.replace('b','["b"')
mylist = mylist.replace('c','"c"]')
print ast.literal_eval(mylist)
#Output:
['a', 'a', 'a', ['b', 'a', 'a', ['b', 'a', 'c'], 'a', ['b', 'a', 'a', 'c'], 'a', 'c'], 'a']
于 2012-05-02T16:44:22.300 に答える
0

次のようにします。

a, b, c = 1, 2, 3

def sublist(l):
  ret = []
  while l:
    val = l.pop(0)
    if val == b:
      ret.append([val] + sublist(l))
    else:
      ret.append(val)
      if val == c: break
  return ret

l = [a, a, a, b, a, a, b, a, c, a, b, a, a, c, a, c, a]
print l
print sublist(l)

これには、変更の副作用があることに注意してくださいl。コピーを作成してそれを変更するのは簡単です。

于 2012-05-02T14:38:14.237 に答える