我有一个班级城市:
class City(object):
#A city has two coordinates in a graph(x,y), and a set of order
def __init__(self, name, x, y, orders):
self.name = name
self.x = x
self.y = y
self.orders = orders
我创建了一个城市列表:
示例:
list_cities = [City1, City2, City3, City4]
City1 (0.0, 0.0) [1, 2]
City2 (1.0, 0.0) [2, 3]
City3 (2.0, 0.0) [1, 3]
City4 (3.0, 0.0) [2]
我想按订单对城市进行分组,以便它看起来像这样:
list1 = [City1, City3]
list2 = [City1, City2, City4]
list3 = [City2, City3]
我已经用词典,列表和集合尝试了它,但它仍然没有给我结果,我不知道我怎么能得到它。 我留给你一个我试过的代码:
tours = []
city = City.create(arrayCity)
for i in range(0,len(city.orders)):
tours[city.orders[i]].append(city)
输出:
IndexError: list index out of range
我希望你能帮助我。 非常感谢你
答案 0 :(得分:1)
您正在获取IndexError
,因为您尝试访问未填充列表中的项目。我想你正试图填写更像这样的东西:
tours = [[],[],[]]
这里还有一些其他问题。您正在从1
开始按整数编制索引,这似乎是每个城市如何设置的示例。您需要调整偏移量。您不需要迭代city.orders
的索引,您实际上只需要这些值。
以下代码需要硬编码您需要填写的列表数量。如果它是已知的很容易,但如果它可以改变则很烦人。以下代码假设您的示例中有3个游览。
tours = [[],[],[]]
city = City.create(arrayCity)
for i in city.orders:
tours[i-1].append(city)
理想情况下,您可能需要更加动态的设置,而不必事先指定群组数量:
tours = []
city = City.create(arrayCity)
for i in city.orders:
while len(tours) < i:
tours.append([])
tours[i-1].append(city)
上面的代码引入了一个while循环,如果你还没有创建你想要填写的子列表,它会将列表添加到tours
。
答案 1 :(得分:0)
如果您希望list1
包含1
中order
的城市,您可以对其进行测试并采取措施:
if 1 in city.order:
list1.append(city)
类似地
if 2 in city.order:
list2.append(city)
if 3 in city.order:
list3.append(city)
答案 2 :(得分:0)
class City:
def __init__(self,name,x,y,orders):
self.name = name
self.x = x
self.y = y
self.orders = orders
City1 = City('City1',0.0,0.0,[1,2])
City2 = City('City2',1.0,0.0,[2,3])
City3 = City('City3',2.0,0.0,[1,3])
City4 = City('City4',3.0,0.0,[2])
list_cities = [City1, City2, City3, City4]
group_cities_by_orders = {}
for i in range(1,len(list_cities)+1):
for city in list_cities:
if i in city.orders:
if i in group_cities_by_orders:
group_cities_by_orders[i].append(city.name)
else:
group_cities_by_orders[i] = [city.name]
print(group_cities_by_orders)
Output:
{1: ['City1', 'City3'], 2: ['City1', 'City2', 'City4'], 3: ['City2', 'City3']}