在Python中搜索和操作列表中的列表

时间:2014-01-07 15:13:31

标签: python list

我有名单和城市名单,我正在尝试编制每个城市的用户数量列表。

我希望有一个类似的列表:

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

我遇到的第一个问题是,当我从文件中读取新行时,我需要检查该城市是否已存在。如果没有,那么我需要添加它并给它1号。所以我尝试过:

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

问题在于,即使城市已经在列表中,搜索也不起作用,因为我猜它是键入以将城市与整个元素匹配,而不仅仅是元素的第一项。有人可以告诉我如何绕过那个吗?

seocnd部分假设城市位于citylist的某个地方,我怎么能将城市名称旁边的数字增加1?

感谢任何指导。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

python dict是您想要实现的目标的正确数据结构。使用defaultdict(int),您也可以直接为指定城市(dict的密钥)递增,即使dict中尚未显示该城市。

答案 2 :(得分: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()

答案 3 :(得分:0)

正如其他人所说,词典正是这类问题的数据结构。但是如果你真的希望它作为列表(例如,为了理解列表的工作原理),你可以按如下方式进行:

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

在理解了这个想法之后,你可以通过在循环中使用“return”来改进代码,它具有类似的效果但是更有效,因为它在找到元素后终止循环:

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])