【问题标题】:Merge 2 different array using List of dictionary in python使用python中的字典列表合并2个不同的数组
【发布时间】:2017-09-18 11:53:20
【问题描述】:

我正在尝试合并 2 个如下所示的数组:

第一:

[650001.88, 300442.2,   18.73,  0.575,  650002.094, 300441.668, 18.775]
[650001.96, 300443.4,   18.7,   0.65,   650002.571, 300443.182, 18.745]
[650002.95, 300442.54,  18.82,  0.473,  650003.056, 300442.085, 18.745]
[650005.28, 300444.76,  18.93,  0.463,  650005.368, 300444.395, 18.659]
[650006.17, 312903.26,  14.68,  0.442,  650006.146, 312902.819, 14.68]
[650006.18, 312902.89,  14.91,  0.243,  650006.146, 312902.819, 14.68]
[650006.17, 300445.16,  18.75,  0.402,  650006.286, 300444.792, 18.635]
[650006.8,  312904.65,  14.54,  0.479,  650006.904, 312905.096, 14.68]
[650006.78, 312905.06,  14.81,  0.184,  650006.904, 312905.096, 14.68]
[650011.84, 300447.74,  18.56,  0.546,  650011.836, 300447.197, 18.507]
[650012.96, 300446.92,  18.71,  0.553,  650013.238, 300446.497, 18.488]
[650014.07, 300447.51,  18.41,  0.614,  650014.2,   300446.914, 18.473]
[650001.18, 312862.23,  8.79,   40.338, 650014.526, 312899.965, 13.797]
[650001.19, 312861.88,  9.15,   40.619, 650014.526, 312899.965, 13.797]

秒:

[300441.668,    1]
[300443.182,    2]
[300442.085,    3]
[300444.395,    4]
[312902.819,    5]
[300444.792,    6]
[312905.096,    7]
[300447.197,    8]
[300446.497,    9]
[300446.914,    10]
[312899.965,    11]

第一个数组的第 7 列与第二个数组的第一列共享相同的参数。我的第一个数组包含近 5000 万条记录,第二个数组包含 50.000 条记录。我正在尝试基于共享列合并两个数组。

我的最终数组应该是这样的

715316  650001.88   300442.2    18.73   0.575   650002.094  300441.668  18.775  1
715317  650001.96   300443.4    18.7    0.65    650002.571  300443.182  18.745  2
715310  650002.95   300442.54   18.82   0.473   650003.056  300442.085  18.745  3
715304  650005.28   300444.76   18.93   0.463   650005.368  300444.395  18.659  4
129733  650006.17   312903.26   14.68   0.442   650006.146  312902.819  14.68   5
129739  650006.18   312902.89   14.91   0.243   650006.146  312902.819  14.68   5
715303  650006.17   300445.16   18.75   0.402   650006.286  300444.792  18.635  6
129851  650006.8    312904.65   14.54   0.479   650006.904  312905.096  14.68   7
129852  650006.78   312905.06   14.81   0.184   650006.904  312905.096  14.68   7
715302  650011.84   300447.74   18.56   0.546   650011.836  300447.197  18.507  8
715301  650012.96   300446.92   18.71   0.553   650013.238  300446.497  18.488  9
715250  650014.07   300447.51   18.41   0.614   650014.2    300446.914  18.473  10
129121  650001.18   312862.23   8.79    40.338  650014.526  312899.965  13.797  11
129127  650001.19   312861.88   9.15    40.619  650014.526  312899.965  13.797  11
129128  650001.19   312861.54   9.53    40.897  650014.526  312899.965  13.797  11

我设法做到了,但目前唯一的问题是我的 d1 字典覆盖了以错误输出结尾的重复键。

def merge_arrays(first, sec):

    d1 = dict((x[5], x[0:]) for x in first)
    d2 = dict((x[0], x[1:]) for x in sec)

    finaldict = {key:(d2[key], d1[key]) for key in d2}

    arr2 = []

    for x in finaldict.values():
        arr2.append(x)
        #print(x)

    arr = np.asarray(arr2)  
    a = np.array(arr)
    output = np.array(list(map(np.concatenate,a)))

我猜我需要使用字典列表而不仅仅是普通字典。但我不知道如何将我的数组转换为具有重复键的字典列表。

编辑:

我尝试使用@zipa 方法:

d2 = dict((x[0], x[1:]) for x in sec)
finaldict = [item + d2[item[5]] for item in first]


print(finaldict[0])


[650001.88, 300442.2,   18.73,  0.575,  650002.094, 300441.668, 18.775]

我猜最后没有增加价值的原因是我的字典的创建方式。当我检查 d2[item[4]] 时,它会创建我 [1.] 而不仅仅是 1。我访问 item[4] 因为在我的数据中它与示例中的 item[5] 具有相同的值。

当我访问时,它会创建这个。

但仍然没有为我的合并数组增加价值。

【问题讨论】:

    标签: arrays python-3.x dictionary


    【解决方案1】:

    理解就行了:

    first = [[650001.88, 300442.2,   18.73,  0.575,  650002.094, 300441.668, 18.775],
             [650001.96, 300443.4,   18.7,   0.65,   650002.571, 300443.182, 18.745],
             [650002.95, 300442.54,  18.82,  0.473,  650003.056, 300442.085, 18.745],
             [650005.28, 300444.76,  18.93,  0.463,  650005.368, 300444.395, 18.659],
             [650006.17, 312903.26,  14.68,  0.442,  650006.146, 312902.819, 14.68],
             [650006.18, 312902.89,  14.91,  0.243,  650006.146, 312902.819, 14.68],
             [650006.17, 300445.16,  18.75,  0.402,  650006.286, 300444.792, 18.635],
             [650006.8,  312904.65,  14.54,  0.479,  650006.904, 312905.096, 14.68],
             [650006.78, 312905.06,  14.81,  0.184,  650006.904, 312905.096, 14.68],
             [650011.84, 300447.74,  18.56,  0.546,  650011.836, 300447.197, 18.507],
             [650012.96, 300446.92,  18.71,  0.553,  650013.238, 300446.497, 18.488],
             [650014.07, 300447.51,  18.41,  0.614,  650014.2,   300446.914, 18.473],
             [650001.18, 312862.23,  8.79,   40.338, 650014.526, 312899.965, 13.797],
             [650001.19, 312861.88,  9.15,   40.619, 650014.526, 312899.965, 13.797]]
    second = [[300441.668,    1],
              [300443.182,    2],
              [300442.085,    3],
              [300444.395,    4],
              [312902.819,    5],
              [300444.792,    6],
              [312905.096,    7],
              [300447.197,    8],
              [300446.497,    9],
              [300446.914,    10],
              [312899.965,    11]]
    
    second_dict = {i[0]: i[1] for i in second}
    first_second = [item + [second_dict[item[5]]] for item in first]
    print first_second[0]
    

    【讨论】:

    • 你能解释一下为什么你从 second_dict 中获取 item[5] 而不仅仅是值吗?
    • 我正在获取与item[5]匹配的键值。
    • 由于某种原因没有为新列表增加价值。当我打印 first_second[0] 时,我只得到 7 条记录而不是 8 条。所以我猜是不是在最终输出中添加新记录。
    • 但另一方面,我从字典中正确查找键只是没有附加到新列表。
    • 应该是8,在我的机器上是8。
    【解决方案2】:

    您只需要将第二个数组转换为dict:

    second_list = [[300441.668,    1],
    [300443.182,    2],
    [300442.085,    3],
    [300444.395,    4],
    [312902.819,    5],
    [300444.792,    6],
    [312905.096,    7],
    [300447.197,    8],
    [300446.497,    9],
    [300446.914,    10],
    [312899.965,    11]]
    
    print(dict(second_list))
    # {312899.965: 11, 300447.197: 8, 300443.182: 2, 300444.792: 6, 300441.668: 1, 300444.395: 4, 300446.497: 9, 312905.096: 7, 312902.819: 5, 300442.085: 3, 300446.914: 10}
    

    它为您提供了第一个数组的快速查找表。无需将第一个数组转换为其他任何内容。如果未找到密钥,您可能希望使用带有默认值的 dict.get

    【讨论】:

    • 我从来没有比较字典和数组之前你能解释一下如何使用它吗?
    猜你喜欢
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 2017-12-29
    • 1970-01-01
    • 2016-01-20
    相关资源
    最近更新 更多