2015-09-03 2 views
1

У меня есть данные (результаты LDA с использованием Gensim), который выглядит следующим образом:списки Python с нерегулярным формате

[(1, 0.97456828373415116)] 
[(0, 0.91883125256489728), (1, 0.020225186991467976), (2, 0.020314851937259213), (3, 0.020382294889184499), (4, 0.020246413617191008)] 
[(0, 0.93783520386426555), (1, 0.015481826214088806), (2, 0.015545735781026492), (3, 0.015535246185968628), (4, 0.015601987954650424)] 
[(2, 0.98493696818505228)] 
[(3, 0.99067359305252778)] 
[(0, 0.73578249201070511), (3, 0.25197028613750805)] 

Я хотел бы преобразовать в следующем формате:

[(0, 0), (1, 0.97456828373415116), (2, 0), (3, 0), (4, 0)] 
[(0, 0.91883125256489728), (1, 0.020225186991467976), (2, 0.020314851937259213), (3, 0.020382294889184499), (4, 0.020246413617191008)] 
[(0, 0.93783520386426555), (1, 0.015481826214088806), (2, 0.015545735781026492), (3, 0.015535246185968628), (4, 0.015601987954650424)] 
[(0, 0), (1, 0), (2, 0.98493696818505228), (3, 0), (4, 0)] 
[(0, 0), (1, 0), (2, 0), (3, 0.96747728928637211), (4, 0)] 
[(0, 0), (1, 0), (2, 0), (3, 0.99067359305252778), (4, 0)] 
[(0, 0.73578249201070511), (1, 0), (2, 0), (3, 0.25197028613750805), (4, 0)] 

ответ

1

Один очень простой способ сделать это заключается в использовании построенный Dict с по умолчанию, а затем обновить его:

>>> d = dict([(0,0),(1,0),(2,0),(3,0)]) 
>>> print(d) 
{0: 0, 1: 0, 2: 0, 3: 0} 
>>> d.update([(0, 0.73578249201070511), (3, 0.25197028613750805)]) 
>>> print(d) 
{0: 0.7357824920107051, 1: 0, 2: 0, 3: 0.25197028613750805} 

Редактировать

Включение предложения hgwell на выходе список кортежей, вот полная функция (которая, вероятно, можно было бы сделать лучше, так или иначе, но это работает так или иначе):

def listify(l): 
    res = [] 
    for j in l: 
     d = dict([(0,0),(1,0),(2,0),(3,0),(4,0)]) 
     d.update(j) 
     res.append(list(d.items())) 
    return res 

и в действии ...

>>> z = listify([[(1, 0.97456828373415116)], 
       [(0, 0.91883125256489728), (1, 0.020225186991467976), (2, 0.020314851937259213), (3, 0.020382294889184499), (4, 0.020246413617191008)], 
       [(2, 0.98493696818505228)]]) 
>>> pprint(z) 
[[(0, 0), (1, 0.9745682837341512), (2, 0), (3, 0), (4, 0)], 
[(0, 0.9188312525648973), 
    (1, 0.020225186991467976), 
    (2, 0.020314851937259213), 
    (3, 0.0203822948891845), 
    (4, 0.020246413617191008)], 
[(0, 0), (1, 0), (2, 0.9849369681850523), (3, 0), (4, 0)]] 
+1

и 'd.items()' или в 'python3'' (d.items())' дает вам необходимый формат списка. – ashwinjv

+0

@hgwells Ха-ха. Я просто * знал * должен был быть способ в python3 делать d.items() вот так! Благодаря! Я отредактирую с определением функции, которое включает в себя (я не забуду это в будущем ...). – zxq9

1

Вы можете изменить каждый подсписок в dict с функцией map():

data = [[(1, 0.97456828373415116)], 
[(0, 0.91883125256489728), (1, 0.020225186991467976), (2, 0.020314851937259213), (3, 0.020382294889184499), (4, 0.020246413617191008)], 
[(0, 0.93783520386426555), (1, 0.015481826214088806), (2, 0.015545735781026492), (3, 0.015535246185968628), (4, 0.015601987954650424)], 
[(2, 0.98493696818505228)], 
[(3, 0.99067359305252778)], 
[(0, 0.73578249201070511), (3, 0.25197028613750805)]] 

results = list(map(dict, data)) 

Тогда использовать метод dict.get и указать значение по умолчанию 0 для ключей, которые не присутствуют в словаре:

for i in range(5): 
    print(results[0].get(i, 0)) 

Результат выше:

0 
0.9745682837341512 
0 
0 
0 
Смежные вопросы