【问题标题】:List sorting - two lists into one列表排序 - 两个列表合二为一
【发布时间】:2017-03-31 00:27:49
【问题描述】:

我必须列出两个清单。一个带有名称(str),第二个带有工资(int)。然后,我必须按姓名对工资进行排序。问题是,当我这样做时,总是只对工资进行排序。

names = ["Asia","Łukasz","Aneta","Ola","Mikołaj"]
wages = [15000,1500,200,14500,2600]

print("Here(should) be sorted list")
wages.sort()
for i in range (len(wages)) :
    print(wages[i],names[i])

为了清楚起见,我想将这两个列表合二为一并对它们进行排序。尽可能用简单的方法。没有函数、集合、拉链等。只有循环。

【问题讨论】:

  • 什么是zarobki
  • @L3viathan:我认为 OP 忘记将 zarobki 翻译成 wages
  • 您可以使用sorted 并提供lambda 作为密钥吗?
  • 您只对一个列表进行排序,然后期望第二个列表也被排序。这些列表没有以任何方式连接。如果你想让他们联系起来,建立一个字典,将工资和名字联系起来。
  • 使用元组。列出(wage, name) 元组,然后它们正常排序。元组自然地按它们的第一个元素排序,因此您只需要正常排序即可。 (这是一种过于复杂的做法sorted(zip(wages, names))

标签: python sorting


【解决方案1】:

如果您只想使用循环来执行此操作,您可以自己实现一些排序算法,并在此过程中交换nameswages 中的相应元素。

这是一个冒泡排序的例子:

for j in range(len(wages)-1,0,-1):
    for i in range(j):
        if wages[i]>wages[i+1]:
            tempWage = wages[i]
            wages[i] = wages[i+1]
            wages[i+1] = tempWage

            tempName = names[i]
            names[i] = names[i+1]
            names[i+1] = tempName

【讨论】:

  • 到目前为止,这是唯一真正让问题变得荒谬的答案。 +1
【解决方案2】:

是的,没有拉链和套装。我们会努力做到这一点。

首先,复制工资:

>>> wages_c = wages[:]

排序副本:

>>> wages_c.sort()

现在,遍历副本并找到对应的原始名称:

>>> for wage in wages_c:
...     key = wages.index(wage)
...     print(wages[key], names[key])

这很愚蠢,如果您有重复的姓名或重复的工资,这将不起作用,但它不使用 zip 或 set。

原解决方案:

我们从您的列表开始:

>>> names = ["Asia","Łukasz","Aneta","Ola","Mikołaj"]
>>> wages = [15000,1500,200,14500,2600]

合并它们:

>>> names_and_wages = list(zip(names, wages))

按第二个元素排序:

>>> names_and_wages.sort(key=lambda x: x[1])

然后打印:

>>> for name, wage in names_and_wages:
...     print(name, wage)

【讨论】:

  • 问题是:“没有函数、集合、拉链等。只有循环。”。是的,我知道...
【解决方案3】:

好吧好吧。如果您不想以任何方式合并列表,那么您需要手动编写一个排序算法,该算法返回一系列移动,您可以将它们应用于两个列表以使它们具有相同的顺序。如果您的列表中只有唯一元素,则可以简化此操作,方法是对一个列表进行排序,然后查看每个元素移动到的位置并将相同的更改应用到另一个列表。

更理智的回答

您有两个相互依赖的列表,即列表中元素的位置。

您需要按名称或工资来决定要对它们进行排序吗?

您可以使用循环轻松zip 这两个列表

i = 0
merged = []
while i < len(wages):
  merged.append((wages[i], names[i]))

然后使用sortkey = lambda x: x[0] 按工资排序,key = lambda x: x[1] 按姓名排序。

【讨论】:

  • 噗?这完美地解释了如何sort the two lists into one
  • Without functions, sets, zips etc. Just with loops.。就像我说的。没有阅读问题。
  • 是的,without functionslen 可以说是一个函数。 lambda 算作函数​​吗?这个问题太不明确了,而且问得也很糟糕。他可以选择手动编写排序算法,对两个列表或类似列表执行相同的交换,但这非常愚蠢,我很确定这也不是他真正想要的。
  • 我不同意最后一部分,但拉链是特别禁止的。
【解决方案4】:

我认为一种方法是建立一个字典来存储姓名和工资。

 names = ["Asia","Łukasz","Aneta","Ola","Mikołaj"]
 wages = [15000,1500,200,14500,2600]
 the_dict = {}
 for i in range(len(names)):
      the_dict[wages[i]] = names[i]


 wages.sort()
 sorted_names = [the_dict[i] for i in wages]
 #now, both names and wages are sorted, and you can print them

 for i in range(len(wages)):
      print(sorted_names[i], wages[i])

【讨论】:

  • 不是唯一的方法,但肯定是一种方法。唯一的问题是我不确定 dicts 是否比 set 或 zips 少。
  • 鉴于 OP 没有回应,我认为我们可以安全地投票结束这个问题,因为它不清楚。我不会对你投反对票,因为我读得越多,这个问题就越荒谬。
  • 不知是否允许不能使用functions的OP使用methods,如wages.sort()...
【解决方案5】:

您可以使用类似于numpy.argsort 的功能:将索引列表排序为正确的顺序,然后使用它重新排列两个列表:

inds = list(range(len(wages))) # This can be converted into a while loop that appends elements until `len(wages)` is reached
inds.sort(key=lambda x: wages[x]) # Or did you want names[x] here?
sorted_wages = []
sorted_names = []
for ind in inds:
    sorted_wages.append(wages[ind])
    sorted_names.append(names[ind])

您可以使用选择工资(如图所示lambda x: wages[x])或姓名(lambda x: names[x])的键进行排序。如果你真的想要,第一行可以替换为类似

inds = []
count = 0
while count < len(wages):
    inds.append(count)
    count += 1

结果如预期:

>>> sorted_wages
[200, 1500, 2600, 14500, 15000]
>>> sorted_names
['Aneta', 'Łukasz', 'Mikołaj', 'Ola', 'Asia']

【讨论】:

    【解决方案6】:

    编辑:没有函数,说真的……没有len(),没有range(),没有.sort()


    初始化我们的东西,

    In [1]: names = ["Asia","Łukasz","Aneta","Ola","Mikołaj"]
       ...: wages = [15000,1500,200,14500,2600]
       ...:
    

    计算列表的长度

    In [2]: l = 0
       ...: for w in wages: l += 1
       ...:
    

    执行一个简单的冒泡排序,我们不仅在要排序的列表中交换元素,而且在兄弟列表中交换元素

    In [3]: j = 0
       ...: while j<(l-1):
       ...:     i = 0 
       ...:     while i<(l-1-j):
       ...:         if wages[i]>wages[i+1]:
       ...:             wages[i], wages[i+1] = wages[i+1], wages[i]
       ...:             names[i], names[i+1] = names[i+1], names[i]
       ...:         i += 1
       ...:     j += 1
       ...:
    

    并打印结果

    In [4]: print names, '\n', wages
    ['Aneta', 'Łukasz', 'Mikołaj', 'Ola', 'Asia']
    [200, 1500, 2600, 14500, 15000]
    

    在冒泡排序中,每个后续的内部循环都在一个较短的(1 个)子列表上运行,因为每个内部循环的最终效果是将当前子列表的最大元素放置在其中的最后一个可用位置。

    我们只需要这些循环中的l-1,因为在l-1-th 内部循环期间,我们对长度为 2 的子列表进行操作,当它完成时,整个子列表已完全排序。

    冒泡排序不是一种有效的算法,但考虑到问题的作业性,我认为使用非常简单的算法比使用有效的算法更重要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-12
      • 2011-09-26
      • 1970-01-01
      相关资源
      最近更新 更多