Сопоставление двух значений списков и добавление в словарь - PullRequest
1 голос
/ 22 апреля 2020

У меня есть список узлов с их координатами в виде

MCoord = [[Node1,X,Y,Z],[Node2,X,Y,Z]...]

Координаты:

MCoord  = [
    [1, 0, 0, 0],
    [2, 0, 1000, 1300],
    [3, 0, 2000, 2000],
    [4, 0, 3000, 2500],
    [5, 0, 4000, 3200],
    [6, 0, 5000, 4200],
    [7, 0, 6000, 6000],
    [8, 1000, 0, 0],
    [9, 1000, 1000, 1300],
    [10, 1000, 2000, 2000],
    [11, 1000, 3000, 2500],
    [12, 1000, 4000, 3200],
    [13, 1000, 5000, 4200],
    [14, 1000, 6000, 6000],
    [15, 2000, 0, 0],
    [16, 2000, 1000, 1300],
    // ...
    [27, 3500, 5000, 4200],
    [28, 3500, 6000, 6000]
]

Я хочу сохранить все узлы (с их координаты) той же координаты X и соответствующие значения ключа под ключами S1 (все узлы с одинаковым значением X), S2, S3 и т. д.

Сценарий:

SectionLocation = {'S1':0 , 'S2':1000 , 'S3':2000 , 'S4':3500}
SectionComplete = {'S1':0 , 'S2':0 , 'S3':0 , 'S4':0}

k = 0
for i in range(len(MCoord)):
    print(i)
    if MCoord[i][1] == SectionLocation[k]:
        keydic = get_key(SectionLocation[k])
        SectionComplete[keydic].append(MCoord[i])
        print(SectionComplete)
    else:
        k = k + 1
print(SectionComplete)

Кажется, я не могу добавить новые значения в словарь. Любой совет?

Желаемый выход:

SectionComplete = {
    'S1' : [
        [1, 0, 0, 0],
        [2, 0, 1000, 1300],
        [3, 0, 2000, 2000],
        [4, 0, 3000, 2500],
        [5, 0, 4000, 3200],
        [6, 0, 5000, 4200],
        [7, 0, 6000, 6000]
    ],
    'S2' : [
        [8, 1000, 0, 0],
        [9, 1000, 1000, 1300],
        [10, 1000, 2000, 2000],
        [11, 1000, 3000, 2500],
        [12, 1000, 4000, 3200],
        [13, 1000, 5000, 4200],
        [14, 1000, 6000, 6000]
    ],
    // ...
}

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020
MCoord = [[...]]

import numpy as np
array_of_coords = np.array((MCoord))

uniq_X = np.unique(array_of_coords[:,1])
group_by_X = [[array_of_coords[array_of_coords[:,1]==i,:] for i in uniq_X]]

list_of_keys = ["S"+str(i) for i in range(len(uniq_X))]

dictionary = dict(zip(list_of_keys, group_by_X[0]))
print(dictionary)

out:

{'S0': array([[   1,    0,    0,    0],
       [   2,    0, 1000, 1300],
       [   3,    0, 2000, 2000],
       [   4,    0, 3000, 2500],
       [   5,    0, 4000, 3200],
       [   6,    0, 5000, 4200],
       [   7,    0, 6000, 6000]]), 'S1': array([[   8, 1000,    0,    0],
       [   9, 1000, 1000, 1300],
       [  10, 1000, 2000, 2000],
       [  11, 1000, 3000, 2500],
       [  12, 1000, 4000, 3200],
       [  13, 1000, 5000, 4200],
       [  14, 1000, 6000, 6000]]), 'S2': array([[  15, 2000,    0,    0],
       [  16, 2000, 1000, 1300]])}
0 голосов
/ 22 апреля 2020

Я верю, что это то, что вы пытаетесь достичь. Но вы можете исправить меня, если я ошибаюсь.

# your list of nodes and coordinates
MCoord = [[1, 0, 0, 0], 
          [2, 0, 1000, 1300], 
          [3, 0, 2000, 2000], 
          [4, 0, 3000, 2500], 
          [5, 0, 4000, 3200], 
          [6, 0, 5000, 4200], 
          [7, 0, 6000, 6000], 
          [8, 1000, 0, 0], 
          [9, 1000, 1000, 1300], 
          [10, 1000, 2000, 2000], 
          [11, 1000, 3000, 2500], 
          [12, 1000, 4000, 3200], 
          [13, 1000, 5000, 4200], 
          [14, 1000, 6000, 6000], 
          [15, 2000, 0, 0], 
          [16, 2000, 1000, 1300]]

# a dictionary mapping of section to its ID
SectionLocation = {0: 'S1', 1000: 'S2', 2000: 'S3', 3500: 'S4'}
# A dictionary of the grouped sections
SectionComplete = {'S1': [], 'S2': [], 'S3': [], 'S4': []}

# we don't need the index since python for loops take care of that for us
for node in MCoord:
    # grab the relevant section from the mapping
    section = SectionLocation[node[1]]

    # append it to that sections empty list
    SectionComplete[section].append(node)

print(SectionComplete)

В вашем примере здесь SectionComplete = {'S1':0 , 'S2':0 , 'S3':0 , 'S4':0} вы инициализируете свои значения dict равными int с, а затем пытаетесь добавить к этим int s. По сути, это все равно что пытаться сделать что-то подобное.

my_int = 0
my_int.append(23)

Это не сработает, потому что int не имеет метода append.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...