创建满足一个条件Python 3.6的多个列表

时间:2017-07-27 21:24:38

标签: python list

我有一个班级城市:

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

我希望你能帮助我。 非常感谢你

3 个答案:

答案 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包含1order的城市,您可以对其进行测试并采取措施:

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']}