Python:按预设索引重新排列列表
Python: Rearrange a list by preconceived index
所以我想输入一个 3 行的文件。
第一行,是列表中的项目数
第二行,关于我想如何重新排列列表的索引。 (有关更多信息,请参见下文)
第三行,数字列表本身
所以从 in.txt 的第二行开始是重新排列列表的索引。很难解释,但这就是它的工作原理(参见 in.txt 以供参考)
第一个数字不变,第二个数字变成第三个数字,第五个数字变成第二个数字,第四个数字变成第五个数字,依此类推
这里是一些示例输入:
in.txt
5
1 3 4 5 2
12 33 96 84 74
output.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
现在的问题是我重新排列了两次项目。
对不起,如果我有点不清楚(大声笑和奇怪的变量名)
将文件读入列表后,您可以使用以下代码对它们进行排序:
>>> 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
你可以试试这个:
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]
假设您已经设法提取职位列表和产品 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 进行演示)
所以我想输入一个 3 行的文件。 第一行,是列表中的项目数 第二行,关于我想如何重新排列列表的索引。 (有关更多信息,请参见下文) 第三行,数字列表本身
所以从 in.txt 的第二行开始是重新排列列表的索引。很难解释,但这就是它的工作原理(参见 in.txt 以供参考) 第一个数字不变,第二个数字变成第三个数字,第五个数字变成第二个数字,第四个数字变成第五个数字,依此类推
这里是一些示例输入: in.txt
5
1 3 4 5 2
12 33 96 84 74
output.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
现在的问题是我重新排列了两次项目。
对不起,如果我有点不清楚(大声笑和奇怪的变量名)
将文件读入列表后,您可以使用以下代码对它们进行排序:
>>> 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
你可以试试这个:
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]
假设您已经设法提取职位列表和产品 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 进行演示)