2015-09-26 1 views
1

Я думал, что с python я был достаточно хорош, но эта проблема меня превзошла.Проблемы с доступом к определенному элементу списка

Следующий код работает

import csv 
f = open("potholes.csv") 
count = 0 
for row in csv.DictReader(f): 
    addr_bits = row['STREET ADDRESS'].split() 

    street_num = addr_bits[0:1] 
    count += 1 
print type(addr_bits) 
print addr_bits 
print street_num 
print "completed processing " + str(count) + " records" 

ВЫВОД:

<type 'list'> 
['2519', 'S', 'HALSTED', 'ST'] 
['2519'] 
completed processing 378033 records 

Этот код однако дает ошибку

import csv 
f = open("potholes.csv") 
count = 0 
for row in csv.DictReader(f): 
    addr_bits = row['STREET ADDRESS'].split() 

    street_num = addr_bits[0] 
    count += 1 
print type(addr_bits) 
print addr_bits 
print street_num 
print "completed processing " + str(count) + " records" 

ВЫВОД:

Traceback (most recent call last): 
    File "/home/linux/PycharmProjects/potholes/potholes", line 7, in <module> 
    street_num = addr_bits[0] 
IndexError: list index out of range 

Process finished with exit code 1 

Единственное отличие состоит в том, что первый код, используемый [0: 1] для доступа к этому списку, использовал вторую часть [0], но я думал, что это законный способ доступа к списку.

+0

Если 'вещь [0]' 'является IndexError', то' thing' нулевой длины. 'thing [: 1]' ('0' - старт по умолчанию) все равно будет работать, но также будет равна нулю; '[] [: 1] == []'. – jonrsharpe

+0

У вас есть пустая строка, используйте 'if addr_bits: street_num = addr_bits [0]', они оба возвращают разные вещи, поэтому код не сопоставим, первый возвращает список, разделяя второй на один элемент, поэтому даже без ошибки ваш код не тот же –

ответ

4

это потому, что иногда грести [ «STREET АДРЕСА»] пусто изготовление row['STREET ADDRESS'].split() возвращает пустой список

и вы можете получить доступ к пустому списку с ломтиками, но не индексирует конкретный элемент.

вот пример:

In [10]: x = [] 

In [11]: x[0:1] # this returns empty list 
Out[11]: [] 

In [12]: x[0] # this will raise an error 
+0

Спасибо, я добавил try/except, и теперь он работает. Я буду принимать это как ответ, как только смогу. – PrestonDocks

+0

Я бы сделал 'len (x)> 0' вместо try и за исключением, его немного чистых – DorElias

+0

@DorElias обратите внимание, что' if len (x)> 0: 'обычно просто написано' if x: 'clean still! – jonrsharpe