我一直在努力寻找解决方案,但不能完全得到任何地方!我肯定有一种我不知道的简单方法来做我想做的事。
我有两个2D列表,a和b(示例如下)。您可以看到,对于大多数值,每个A列表中的位置[1]与B列表中的位置[0]相匹配(例如,列表 A 3中的5158648.0与列表 B 3中的5158648.0相匹配)-我已经将匹配放在粗体中。
换句话说,B是一个位长序列,a与B在同一序列中,但只有B的某些值
= [[1000002.0, 0], [1000004.0, 1000002.0], [5158670.0, 5158648.0 ], [5158261.0, 5159627.0 ], [5155371.0, 5158256.0 ], [5258673.0, 5158648.0 ]]
b =[[1000004.0,"助教"],[1000005.0,"助教"],[ 5158648.0 ,"英尺"],[5158670.0,"英尺"],[5387625.0,"英尺"],[5158624.0,"英尺"],[5158623.0,"英尺"],[5158668.0,"英尺"],[5158589.0,"英尺"],[5158641.0,"英尺"],[5158640.0,"英尺"],[ 5159627 。0, '英尺'],[5158261.0,"英尺"],[5158664.0,"助教"],[5158293.0,"助教"],[5158291.0,"助教"],[5158289.0,"助教"],[5158274.0,"助教"],[5158258.0,"助教"],[5158272.0,"助教"],[5158270.0,"助教"],[5158287.0,"助教"],[ 5158256.0 ,"助教"],[ 5158648.0 ,"助教"]]
我想做的是让'TF/FT'从B到A中的正确位置。
对于字典来说这将是非常容易的,但复杂的是一个值(例如5158648.0)可以在序列的不同位置有两个值('FT'在一点,然后'TF'进一步)…因此,我需要说"在序列的这个位置它有'FT',但在序列的另一个位置它有'TF' -参见上面的例子,其中5158648.0既是FT又是TF。
有谁知道实现这一点的最佳方法吗?期望的最终产品如下:
c =[[1000002.0, 0,"N/A"],[1000004.0,1000002.0,"N/A"],[5158670.0, 5158648.0 ,《《金融时报》 '], [5158261.0, 5159627.0 ,《《金融时报》 '], [5155371.0, 5158256.0 ,《 TF '], [5258673.0, 5158648.0 ,"助教"]]
注意,有些值(这里是'0'和'1000002.0')根本没有出现在b中,所以我需要考虑这些。
我试着让列表到我有两个相同长度的匹配值的列表的阶段,然后运行zip()来传输值,但棘手的一点是修剪列表,以获得这两个相同的列表,特别是在2D方面。
谢谢你!
注。如果上下文是有帮助的-每个数字都是街道ID, 'FT'/'TF'是行进方向(因此为什么它可以是一个值或另一个值-这取决于它的行进方向)
我希望我明白你在做什么。正如我所理解的,'a'决定了序列,'b'中唯一重要的顺序是相同值的'ft'和'tf'值之间。因此,我会使用字典,按顺序列出可用值(在你的问题中,你暗示你控制'b'的样子):
b = {[1000004.0: ['TF'], [1000005.0: ['TF'], 158648.0: ['FT','TF'],
158670.0: ['FT'], 387625.0: ['FT'], 158624.0: ['FT'], 158623.0: ['FT'],
158668.0: ['FT'], 158589.0: ['FT'], 158641.0: ['FT'], 158640.0: ['FT'],
159627.0: ['FT'], 158261.0: ['FT'], 158664.0: ['TF'], 158293.0: ['TF'],
158291.0: ['TF'], 158289.0: ['TF'], 158274.0: ['TF'], 158258.0: ['TF'],
158272.0: ['TF'], 158270.0: ['TF'], 158287.0: ['TF'], 158256.0: ['TF']}
那么你只需要:
for x,y in a:
try:
c.append((x,y,b[y][0]))
b[y].pop(0)
except (IndexError,KeyError):
c.append((x,y,'NA'))