【问题标题】:How to reverseTuples defined in list?如何反转列表中定义的元组?
【发布时间】:2019-02-02 07:54:53
【问题描述】:

我不知道如何解释,但我会尝试。我有预定义的元组和一个包含这些元组的列表:

EL = (42.7358, -84.4844)
Det = (42.3831, -83.1022)
Kal = (42.2747, -85.5883)
AA = (42.2753, -83.7308)
Lan = (42.7092, -84.5539)
GR = (42.9614, -85.6558)
SSM = (46.4844, -84.3656)

cities = [EL, Det, Kal, AA, Lan, GR, SSM]
  1. 城市按 (x, y) 顺序排列。如何将订单交换为 (y, x) 并将其保存为 city2。

  2. 如何颠倒城市中元素的顺序?例如,它将是这样的:

    cities3 = [SSM, GR, Lan, AA, Kal, Det, EL]
    

我尝试过 city.reverse(),但它颠倒了坐标。任何提示和帮助将不胜感激。

谢谢大家。

【问题讨论】:

    标签: python-3.x list tuples


    【解决方案1】:

    你是正确的关于颠倒项目:

    cities.reverse()
    

    reverse 完成这项工作,将项目反转到位(它修改了cities):

    由于您有坐标元组,因此无法就地交换 (x,y) 但是 ,如果你想创建另一个列表,列表推导是正确的工具之一。

    如果你想把(x,y) 换成(x,y)

    cities_swap_xy = [(y,x) for (x,y) in cities]
    

    以相反的顺序创建另一个列表:

    cities_reverse = cities[-1:0:-1]
    

    交换坐标和反转城市:

    cities_reverse_and_swap_xy = [(y,x) for (x,y) in cities[-1:0:-1]]
    

    有很多关于列表推导的文档,好好学习!

    【讨论】:

    • 嗨!非常感谢您的提示!它帮助了我很多,并给了我一些如何操作元素的想法。现在我知道关键字是“列表理解”。
    【解决方案2】:

    你有一个元组列表。交换元组只是访问元组中 0 索引之前的第一个索引并存储输出的问题。

    EL = (42.7358, -84.4844)
    Det = (42.3831, -83.1022)
    Kal = (42.2747, -85.5883)
    AA = (42.2753, -83.7308)
    Lan = (42.7092, -84.5539)
    GR = (42.9614, -85.6558)
    SSM = (46.4844, -84.3656)
    
    cities = [EL, Det, Kal, AA, Lan, GR, SSM]
    print(cities)
    #Output:
    [(42.7358, -84.4844),
     (42.3831, -83.1022),
     (42.2747, -85.5883),
     (42.2753, -83.7308),
     (42.7092, -84.5539),
     (42.9614, -85.6558),
     (46.4844, -84.3656)]
    
    
    cities2 = [(x[1], x[0]) for x in cities]
    print(cities)
    #Output:
    [(-84.4844, 42.7358),
     (-83.1022, 42.3831),
     (-85.5883, 42.2747),
     (-83.7308, 42.2753),
     (-84.5539, 42.7092),
     (-85.6558, 42.9614),
     (-84.3656, 46.4844)]
    

    至于反转列表,有many ways to reverse a list。有的创建副本,有的修改原始列表,如.reverse()

    cities3 = cities[::-1] #created a reversed copy.
    #Alternatively
    cities3 = list(reversed(cities))
    

    不过,最后是一个建议。

    您的元组列表没有多大意义,但名称标签赋予了元组含义。

    您应该考虑使用不同的数据结构来存储此信息,dictionaries 在这种情况下是有意义的。您可以将它们视为key:value 对之间的映射。

    EL = (42.7358, -84.4844)
    Det = (42.3831, -83.1022)
    Kal = (42.2747, -85.5883)
    AA = (42.2753, -83.7308)
    Lan = (42.7092, -84.5539)
    GR = (42.9614, -85.6558)
    SSM = (46.4844, -84.3656)
    
    cities = [EL, Det, Kal, AA, Lan, GR, SSM]
    city_names = ["EL", "Det", "Kal", "AA", "Lan", "GR", "SSM"]
    cities_dict = dict(zip(city_names, cities))
    

    请注意,以上代码等价于以下内容:

    cities_dict = {"EL": EL,
              "Det": Det,
              "Kal": Kal,
              "AA": AA,
              "Lan": Lan,
              "GR": GR,
              "SSM": SSM
            }
    
    print(cities_dict)
    #Output:
    {'EL': (42.7358, -84.4844),
     'Det': (42.3831, -83.1022),
     'Kal': (42.2747, -85.5883),
     'AA': (42.2753, -83.7308),
     'Lan': (42.7092, -84.5539),
     'GR': (42.9614, -85.6558),
     'SSM': (46.4844, -84.3656)}
    

    现在,需要注意的是,字典本质上是无序的。如果您想要一个支持排序的类 dict 数据结构,请使用 OrderedDict

    from collections import OrderedDict
    cities = [EL, Det, Kal, AA, Lan, GR, SSM]
    city_names = ["EL", "Det", "Kal", "AA", "Lan", "GR", "SSM"]
    cities_dict = OrderedDict(zip(city_names, cities))
    print(cities_dict)
    
    cities2_dict = OrderedDict((key, (v[1], v[0])) for (key,v) in cities_dict.items())
    print(cities2_dict)
    
    cities3_dict = OrderedDict(reversed(cities_dict.items()))
    print(cities3_dict)
    

    【讨论】:

    • 您好!谢谢你给我一些想法。它非常有帮助。没想到早点用字典。非常感谢!
    猜你喜欢
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    相关资源
    最近更新 更多