2014-01-07 82 views
0

我有名字和城市的列表,並試圖編譯每個城市的用戶數量列表。在Python中搜索和處理列表中的列表

我想有一個看起來像列表:

citylist = (['New York', 53], ['San Francisco', 23], ['Los Angeles', 54]) 

第一個問題我有是,當我從文件中讀取一個新行,我需要檢查是否該城市已經存在。如果沒有的話,我需要添加它,並給它數1。所以我曾嘗試:

if city not in citylist: 
    citylist.append([city, 1]) 

問題的是,即使城市已經在列表中搜索不起作用因爲我猜想它是打字,以匹配城市的整個元素,而不僅僅是元素的第一項。有人能告訴我如何繞過嗎?

seocnd部分是讓我們假設城市在城市名單中找到某處,那麼我怎麼才能將城市名稱旁邊的數字加1?

感謝您的任何指導。

+1

它是否必須是列表或可以使用字典? – IanAuld

+0

看起來字典是要走的路,謝謝大家。 – user3169632

回答

1

python dict是您想要存檔的正確數據結構。使用defaultdict(int)即使dict中尚未存在,您也可以直接爲特定城市(dict的關鍵字)增加。

3

這裏使用字典或collections.Counter。列表不是此任務的適當數據結構。

普通詞典例如:

citydict = {'New York': 53, 
      'San Francisco': 23, 
      'Los Angeles': 54} 

現在只需更新字典是這樣的:

for line in file_obj: 
    city = #do something with line 
    citydict[city] = citydict.get(city, 0) + 1 
+0

您建議使用_collections.Counter_,然後創建常規字典。計數器使_get_變得冗餘。 – volcano

+0

@volcano我建議兩個。 '計數器'的文檔頁面上有足夠的例子來說明如何做到這一點。 –

0

使用字典,以保持計數器 這裏是一個示例代碼:

citydict = {} 

all_cities = open("cities.txt", "r").readlines() 

for city in all_cities: 
    if citydict.has_key(city): 
     citydict[city] +=1 
    else: 
     citydict[city] = 1 

print citydict.items() 
+1

這是一個非常低效的方式來使用字典 – volcano

+0

'has_key'已被棄用,與'in'運算符相比效率低下。所以,不要使用它。並且不需要將所有行讀入內存。 –

0

正如其他人所說,這個詞典正好是這種類型的數據結構oblems。但如果你真的想把它當作列表(例如,瞭解清單是如何工作的),你可以按如下做到這一點:

def add_to_citylist(citylist, city): 
    """modifies citylist according to spec""" 

    city_already_in_citylist = False 
    #iterate throuch citylists and get city-sub-list as c: 
    for c in citylist: 
     if c[0] == city: 
      #city found, so update count 
      c[1] += 1 
      #take a note that city was in list: 
      city_already_in_citylist = True 
    if not city_already_in_citylist: 
     #we did not find city in citylist --> add it 
     citylist.append([city, 1]) 


#your citylist should be a list (not a tuple (...)) since a tuple is unmutable 
citylist = [['New York', 53], ['San Francisco', 23], ['Los Angeles', 54]] 

add_to_citylist(citylist, "Boston") 
add_to_citylist(citylist, "New York") 

print citylist 

理解的想法後,就可以通過在循環中使用「迴歸」提高代碼具有類似的效果,但是因爲它在發現該元素之後終止循環,所以更有效:

def add_to_citylist(citylist, city): 
    """modifies citylist according to spec""" 

    #iterate throuch citylists and get city-sub-list as c: 
    for c in citylist: 
     if c[0] == city: 
      #city found, so update count 
      c[1] += 1 
      break 
    citylist.append([city, 1])