2010-10-04 3 views
2

это код, я пытаюсь создать 2D-матрицусоздать массив 2d в python?

m=4 
tagProb=[[]]*(m+1) 
count=0 
index=0 
for line in lines: 
    print(line) 
    if(count < m+1): 
     tagProb[index].append(line.split('@@')[2].strip()) 
     count+=1 
    if(count == m+1): // this check to goto next index 
     count = 0 
     index+=1 
print(tagProb) 

я получаю о/р

[['0.0', '0.6', '0.05', '0.3', '0.05', '0.1', '0.0', '0.6', '0.0', '0.0', '0.1', '0.0', '0.0', '0.9', '0.0', '0.1', '0.0', '0.2', '0.7', '0.0', '0.1', '0.0', '0.9', '0.0', 0.0'], ['0.0', '0.6', '0.05', '0.3', '0.05', '0.1', '0.0', '0.6', '0.0', '0.0', '0.1', '0.0', .0', '0.9', '0.0', '0.1', '0.0', '0.2', '0.7', '0.0', '0.1', '0.0', '0.9', '0.0', '0.0'], '0.0', '0.6', '0.05', '0.3', '0.05', '0.1', '0.0', '0.6', '0.0', '0.0', '0.1', '0.0', '0.0','0.9', '0.0', '0.1', '0.0', '0.2', '0.7', '0.0', '0.1', '0.0', '0.9', '0.0', '0.0'] ] 

все значения добавляются и список имеет одинаковые значения. Как я могу избежать этого?

+3

Sidenote: если вы хотите выполнять операции с матрицами, вы действительно хотите использовать http://numpy.scipy.org –

+0

Согласитесь с Джимом Брисом выше этого числа, это способ пойти, если вы делаете серьезные операции с матрицами, но есть еще один способ имитации 2d массивов в Python: используйте dict, с кортежем (строка, столбец) для ключа. Полезно для некоторых приложений, неудобно для других. –

ответ

10

Вы используете * в списках, который имеет Гоча - это составить список лотов ссылок на же объекта. Это нормально для неизменяемых, например, int s или tuple s, но не для таких переменных, как list, потому что изменение одного из объектов изменит их все. См:

>>> foo = [[]]*10 
>>> foo[0].append(1) 
>>> foo 
[[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]] 

Если вы не хотите, чтобы это произошло, стандартный способ избежать этого заключается в использовании списка понимания, который будет инициализировать список с новыми объектами:

>>> bar = [[] for _ in range(10)] 
>>> bar[0].append(1) 
>>> bar 
[[1], [], [], [], [], [], [], [], [], []] 

Однако, эта проблема не очень сильно проявляется в идиоматическом Python, потому что инициализация большого списка - это не обычная вещь - это очень менталитет C. (Это не значит, что иногда это не так - Python - это мультипарадигма!)

На другом примечании ваш код не очень приятный. Цикл for в Python предназначен для обработки итераций по объектам, так что вам не нужно управлять индексами (index и count в вашем коде) вручную. Было бы лучше переписать следующим образом:

import numpy as np 
m = 4 
tagProb = np.array(list(line.split("@@")[2].strip() for line in lines))) 
tagProb = tagProb.reshape((m+1,-1)).T 

Пояснение: первая строка определяет tagProb как Numpy массив (быстрый C на основе типа массива с множеством линейных функций алгебры) одного измерения со всеми значениями в ряд. Вторая строка забирает ее в матрицу высотой m+1 и выводимую ширину (обратите внимание, что она должна быть квадратной для этого, вы можете поместить ее с None, если это необходимо), а затем перенесет ее. Я считаю, что это то, что делает ваша итерация, но это очень трудно понять - сообщите мне, хотите ли вы с этим.

+0

+1 для инициализации списков есть парадигма C – Falmarri

1

Создать один список в то время, и вставить их:

import copy 
m=4 
tagProb=[] 
count=0 
index=0 
for line in lines: 
    print(line) 
    innerlist = [] 
    if(count < m+1): 
     innerlist.append(line.split('@@')[2].strip()) 
     count+=1 
    if(count == m+1): // this check to goto next index 
     count = 0 
     index+=1 
     tagProb.append(copy.deepcopy(innerlist)) 
     innerlist = [] 
print(tagProb) 

Как вы можете видеть, есть innerlist, который добавляется к, то для каждой строки, он добавляет список в список списков. (Возможно, вы захотите сделать копию списка).

+0

это сработало с небольшим изменением. – harshit

0
m=4 
tagProb=[] 
count=0 
index=0 
innerlist = [] 
for line in lines: 
print(line) 

if(count < m+1): 
    innerlist.append(line.split('@@')[2].strip()) 
    count+=1 
if(count == m+1): // this check to goto next index 
    count = 0 
    index+=1 
    tagProb.append(innerlist) 
    innerlist = [] 
print(tagProb) 
Смежные вопросы