2012-01-03 19 views
35

listelerine ekleyerek Liste dizinleriyle ilgili olarak kızarım ve yanlış yaptığımı açıklayamıyorum.Öğeleri python

Listede bir liste oluşturmak istediğim bir kod parçam var; her biri, csv dosyasından görüntülenen aynı devre parametresinin (voltaj, akım vb.) Değerlerini içeren Bu:

Sample, V1, I1, V2, I2 
0, 3, 0.01, 3, 0.02 
1, 3, 0.01, 3, 0.03 

Ve böyle devam eder. İstediğim örneğin V1 ve I1 içeren bir liste oluşturmak için (ancak ben etkileşimli seçti istiyorum) şeklinde [[V1], [I1]] böylece,:

[[3,3], [0.01, 0.01]] 

Ben kodu kullanıyorum şu: positions Ben .csv dosyadan kopyalamak istediğiniz sütun dizinleri içeren bir liste iken

plot_data = [[]]*len(positions)  
for row in reader: 
    for place in range(len(positions)): 
     value = float(row[positions[place]]) 
     plot_data[place].append(value) 

plot_data, tüm değerleri içeren listedir. Sorun şu ki, kabukta komutları denediğimde işe yarayacak gibi görünüyor, ancak her değeri doğru alt listeye eklemek yerine komut dosyasını çalıştırırsam, tüm değerleri tüm listelere ekler, böylece 2 (veya daha fazla) elde ederim) aynı listeler. Eğer len(positions) kere aynı listeyi tekrar vardır

plot_data = [[]] * len(positions) 

:

cevap

72

Python listeleri değişken nesneler ve burada.

>>> plot_data = [[]] * 3 
>>> plot_data 
[[], [], []] 
>>> plot_data[0].append(1) 
>>> plot_data 
[[1], [1], [1]] 
>>> 

Listenizdeki her liste, aynı nesneye yapılan bir başvurudır. Birini değiştirirsiniz, hepsinde değişiklik görürsünüz. örneğin

plot_data = [[] for _ in positions] 

:

>>> pd = [[] for _ in range(3)] 
>>> pd 
[[], [], []] 
>>> pd[0].append(1) 
>>> pd 
[[1], [], []] 
+0

Müthiş Farklı listeleri istiyorsanız

, bu şekilde yapabilirsiniz! Sadece ben ne aradım – Jay

+1

Birisi alt çizgi kara büyü iyi bir açıklama var mı? [Throwaway değişkeni] olarak kullanıldığına inanıyorum (http://stackoverflow.com/questions/5893163/what-is-the-purpose-of-the-single-underscore-variable-in-python) ama hala Bunun ne anlama geldiğini tam olarak anlama. –

+0

@AustinA Bağlantınızdaki SO sorusunda seçilen cevaptan tam olarak ne anlamıyorsunuz? – joaquin

2
import csv 
cols = [' V1', ' I1'] # define your columns here, check the spaces! 
data = [[] for col in cols] # this creates a list of **different** lists, not a list of pointers to the same list like you did in [[]]*len(positions) 
with open('data.csv', 'r') as f: 
    for rec in csv.DictReader(f): 
     for l, col in zip(data, cols): 
      l.append(float(rec[col])) 
print data 

# [[3.0, 3.0], [0.01, 0.01]] 
+0

doğru, ama ne kadar sayıda ve hangi baskı kümeleri yazdırmak istediğinizi seçmeli olarak seçmem gerekiyor ... – clabacchio

+0

@clabacchio - cevabımı güncelledim. Şimdi herhangi bir sütun sırasına göre çalışır. – eumiro