Python: разделить список в массиве - PullRequest
2 голосов
/ 13 декабря 2010

Просто начинаю с python и знаю достаточно, чтобы знать, что я ничего не знаю. Я хотел бы найти альтернативные способы разделения списка на список диктовок. Пример списка:

data = ['**adjective:**', 'nice', 'kind', 'fine',
        '**noun:**', 'benefit', 'profit', 'advantage', 'avail', 'welfare', 'use', 'weal', 
        '**adverb:**', 'well', 'nicely', 'fine', 'right', 'okay'] 

Я бы смог получить:

[{'**adjective**': ('nice', 'kind', 'fine'),
 '**noun**': ('benefit', 'profit', 'advantage', 'avail', 'welfare', 'use', 'weal'),
 '**adverb**': ('well', 'nicely', 'fine', 'right', 'okay')}] 

Ответы [ 5 ]

10 голосов
/ 13 декабря 2010

Это может быть как можно ближе к тому, что вы просили:

d = collections.defaultdict(list)
for s in data:
    if s.endswith(":"):
        key = s[:-1]
    else:
        d[key].append(s)
print d
# defaultdict(<type 'list'>, 
#     {'adjective': ['nice', 'kind', 'fine'], 
#      'noun': ['benefit', 'profit', 'advantage', 'avail', 'welfare', 'use', 'weal'], 
#      'adverb': ['well', 'nicely', 'fine', 'right', 'okay']})

Редактировать: просто для удовольствия альтернативный двухслойный, вдохновленный ответом SilentGhost:

g = (list(v) for k, v in itertools.groupby(data, lambda x: x.endswith(':')))
d = dict((k[-1].rstrip(":"), v) for k, v in itertools.izip(g, g))
5 голосов
/ 13 декабря 2010
>>> data = ['adjective:', 'nice', 'kind', 'fine', 'noun:', 'benefit', 'profit', 'advantage', 'avail', 'welfare', 'use', 'weal', 'adverb:', 'well', 'nicely', 'fine', 'right', 'okay']
>>> from itertools import groupby
>>> dic = {}
>>> for i, j in groupby(data, key=lambda x: x.endswith(':')):
    if i:
        key = next(j).rstrip(':')
        continue
    dic[key] = list(j)

>>> dic
{'adjective': ['nice', 'kind', 'fine'], 'noun': ['benefit', 'profit', 'advantage', 'avail', 'welfare', 'use', 'weal'], 'adverb': ['well', 'nicely', 'fine', 'right', 'okay']}
1 голос
/ 13 декабря 2010

Приведенный ниже код даст вам словарь с одной записью для каждого слова с двоеточием после него.

data = ['adjective:', 'nice', 'kind', 'fine', 'noun:', 'benefit', 'profit', 'advantage', 'avail', 'welfare', 'use', 'weal', 'adverb:', 'well', 'nicely', 'fine', 'right', 'okay']
result = {}
key = None
for item in data:
 if item.endswith(":"):
  key = item[:-1]
  result[key] = []
  continue
 result[key].append(item)
0 голосов
/ 14 декабря 2010

А если после них были ключи без элементов списка?, Я думал.Поэтому я добавил «nada:» впереди, «none:» в середине и «oops:» в конце списка с именем data.

Затем, в этих условиях, код 1 (в следующем) с groupy, по-видимому, дает полностью ложный результат, код 2 с defaultdict дает результат, в котором ключи 'nada:', 'nothing:' и 'oops:' отсутствуют.Они также менее быстры, чем простейшее решение (код 3: Кэмерон, пользователь506710)

У меня была идея => коды 4 и 5. Результаты в порядке, а выполнение быстрее.

from time import clock

data = ['nada:',    # <<<=============
    'adjective:',
    'nice', 'kind', 'fine',
    'noun:',
    'benefit', 'profit', 'advantage', 'avail', 'welfare', 'use', 'weal',
    'nothing:', # <<<=============
    'adverb:',
    'well', 'nicely', 'fine', 'right', 'okay',
    'oops:'     # <<<=============
    ]

#------------------------------------------------------------
from itertools import groupby

te = clock()
dic1 = {}
for i, j in groupby(data, key=lambda x: x.endswith(':')):
    if i:
        key = next(j).rstrip(':')
        continue
    dic1[key] = list(j)
print clock()-te,'    groupby'
print dic1,'\n'

#------------------------------------------------------------
from collections import defaultdict
te = clock()
dic2 = defaultdict(list)
for s in data:
    if s.endswith(":"):
        key = s[:-1]
    else:
        dic2[key].append(s)
print clock()-te,'   defaultdict'
print dic2,'\n\n==================='

#=============================================================
te = clock()
dic4 = {}
for x in data:
    if x[-1] == ':' :
        start = x.rstrip(':')
        dic4[start] = []
    else:
    dic4[start].append(x)
print clock() - te
print dic4,'\n'

#------------------------------------------------------------
te = clock()
dic3 = {}
der = len(data)
for i,y in enumerate(data[::-1]):
    if y[-1]==':':
        dic3[y[0:-1]] = data[len(data)-i:der]
        der = len(data)-i-1
print clock()-te
print dic3,'\n'

    #------------------------------------------------------------
te = clock()
dic5 = {}
der = len(data)
for i in xrange(der-1,-1,-1):
    if data[i][-1]==':':
        dic5[data[i][0:-1]] = data[i+1:der]
        der = i
print clock() - te
print dic5

print '\ndic3==dic4==dic5 is',dic3==dic4==dic5
0 голосов
/ 13 декабря 2010

Если вы предполагаете, что inner - это список слов, у вас может быть это как код

data = ['adjective:', 'nice', 'kind', 'fine', 'noun:', 'benefit', 'profit', 'advantage', 'avail', 'welfare', 'use', 'weal', 'adverb:', 'well', 'nicely', 'fine', 'right', 'okay']

dict = {}

for x in data:

    if x[-1] == ':' :

       start = x.rstrip(':')

       dict[start] = []

    else:

       dict[start].append(x)

print dict

Это печатает следующий словарь

{'adjective': ['nice', 'kind', 'fine'], 'noun': ['benefit', 'profit', 'advantage', 'avail', 'welfare', 'use', 'weal'], 'adverb': ['well', 'nicely', 'fine', 'right', 'okay']}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...