我有名单和城市名单,我正在尝试编制每个城市的用户数量列表。
我希望有一个类似的列表:
citylist = (['New York', 53], ['San Francisco', 23], ['Los Angeles', 54])
等
我遇到的第一个问题是,当我从文件中读取新行时,我需要检查该城市是否已存在。如果没有,那么我需要添加它并给它1号。所以我尝试过:
if city not in citylist:
citylist.append([city, 1])
问题在于,即使城市已经在列表中,搜索也不起作用,因为我猜它是键入以将城市与整个元素匹配,而不仅仅是元素的第一项。有人可以告诉我如何绕过那个吗?
seocnd部分假设城市位于citylist的某个地方,我怎么能将城市名称旁边的数字增加1?
感谢任何指导。
答案 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])