【问题标题】:Python: Rearrange a list by preconceived indexPython:通过先入为主的索引重新排列列表
【发布时间】:2017-12-17 00:57:04
【问题描述】:

所以我想用 3 行输入一个输入文件。 第一行,是列表中的项目数 第二行,关于我想如何重新排列列表的索引。 (见下文了解更多信息) 第三行,数字列表本身

所以 in.txt 的第二行是重新排列列表的索引。很难解释,但这就是它的工作方式(参见 in.txt 以供参考) 第一个数字保持不变,第二个数字变为第三个,第五个数字变为第二个,第四个变为第五个,依此类推。

这里有一些示例输入: 在.txt

5
1 3 4 5 2
12 33 96 84 74

输出.txt

12
74
33
96
84

这是程序本身:

fin = open('in.txt','r') #file in
fout = open('output.txt','w') #file out

indata = fin.readlines()
cownum = int(indata[0])
print(cownum)
posmove = indata[1]
cid = indata[2]

poss=posmove.split()
ids=cid.split()

print(poss)
print("")

i=0
while i != int(cownum):
  print(poss[i])
  ids.insert((int(poss[i])-1), ids.pop(i))
  i=i+1
  print(i)
  print(ids)


newids = str(ids)
fout.write(newids)


fin.close()
fout.close()

只是一些背景信息,列表中的数字有点像产品 ID

现在的问题是我重新排列了两次项目。

对不起,如果我有点不清楚(大声笑和奇怪的变量名)

【问题讨论】:

    标签: python python-3.x python-2.7 list python-2.x


    【解决方案1】:

    将文件读入列表后,您可以使用以下代码对它们进行排序:

    >>> indexes = [1, 3, 4, 5, 2]
    >>> values = [12, 33, 96, 84, 74]
    >>> newlist = [0, 0, 0, 0, 0]
    ...
    ...
    >>> for x, y in zip(indexes, values):
    ...     newlist[x-1] = y
    ... 
    >>> for x in newlist:
    ...     print(x)
    ... 
    12
    74
    33
    96
    84
    

    【讨论】:

    • 我在 '_newlist[x-1] = y' 这一行上得到一个不支持的操作数类型错误 -: 'str' 和 'int'
    • list(map(int, values))做了它
    【解决方案2】:

    你可以试试这个:

    file_data = [map(int, i.strip('\n').split()) for i in open('filename.txt')]
    new_data = [i[-1] for i in sorted(zip(file_data[1], file_data[-1]), key=lambda x:x[0])]
    

    输出:

    [12, 74, 33, 96, 84]
    

    【讨论】:

    • 你真是个脱衣舞娘......即使你不需要这样做:-)
    【解决方案3】:

    假设您已经设法提取了职位列表和产品 ID 列表(您仍然需要将数据转换为整数):

    positions = [1, 3, 4, 5, 2]
    product_ids = [12, 33, 96, 84, 74]
    

    您可以使用名为 decorate-sort-undecorate 的模式按给定位置对产品 ID 进行排序:

    >>> [prod_id for (pos, prod_id) in sorted(zip(positions, product_ids))]
    [12, 74, 33, 96, 84]
    

    分步说明:

    我们首先装饰产品 ID 列表及其对应位置:

    >>> zip(positions, product_ids)
    [(1, 12), (3, 33), (4, 96), (5, 84), (2, 74)]
    

    然后我们对装饰列表进行排序 - 这将给我们一个正确的顺序,因为元组是按项目排序的,并且由于第一项是一个位置,这给了我们想要的顺序。

    >>> sorted(zip(positions, product_ids))
    [(1, 12), (2, 74), (3, 33), (4, 96), (5, 84)]
    

    最后,我们取消装饰(解包)现在排序的元组列表,以获得按所需顺序排列的产品 ID 列表(同时丢弃它们的位置信息):

    >>> [prod_id for (pos, prod_id) in sorted(zip(positions, product_ids))]
    [12, 74, 33, 96, 84]
    

    (使用 Python 2 进行演示)

    【讨论】:

      猜你喜欢
      • 2021-12-24
      • 2019-11-12
      • 2017-02-08
      • 1970-01-01
      • 1970-01-01
      • 2018-10-17
      • 1970-01-01
      • 2018-10-28
      • 1970-01-01
      相关资源
      最近更新 更多