есть ли способ избежать вложенного цикла - PullRequest
0 голосов
/ 11 апреля 2019

Мне даны два разных данных, и мне интересно, есть ли способ получить конкретные данные без использования вложенного цикла

firstdata = [[["key"],["value"]],
              [[2],["two"]],
              [[3],["three"]]]
seconddata = [[[key],["artimatic"]],
               [[2],["0+2"]],
               [[2],["1+1"]],
               [[3],["0+3"]],
               [[3],["1+2"]],
               [[3],["2+1"]]]
 //nested loop solution would look like this
 for x in firstdata:
     for y in seconddata:
         print(x[1])
         if x[0]==y[0]:
             print(y)

Есть ли альтернативное решение, чтобы я мог зациклить вторые данные, не используя вложенный цикл?

Ответы [ 3 ]

1 голос
/ 11 апреля 2019

** Хорошо, я предполагаю, что структура данных firstdata и seconddata будет одинаковой:


firstdata_dict = {x[0][0]: x[1][0] for x in firstdata}
seconddata_dict = {}

for data in seconddata:

   if not seconddata_dict.has_key(data[0][0]):
       seconddata_dict[data[0][0]] = []
   seconddata_dict[data[0][0]].append(data[1][0])

for key, value in firstdata_dict.items():
    if seconddata_dict.get(key):
       # key match add your algo 
       print seconddata_dict[key]

Output:
['0+2', '1+1']
['0+3', '1+2', '2+1']
['artimatic']
0 голосов
/ 11 апреля 2019

Я не думаю, что два ответа правильно понимают вопрос, так что вот вам:

Создайте свои данные

firstData = [[["key"],["value"]],
              [[2],["two"]],
              [[3],["three"]]]
secondData = [[['key'],["artimatic"]],
               [[2],["0+2"]],
               [[2],["1+1"]],
               [[3],["0+3"]],
               [[3],["1+2"]],
               [[3],["2+1"]]]

Тогда

firstdata_dict = {x[0][0]: x[1][0] for x in firstData} #Creates the dictionary of first Data

Затем выполните вычисления

for element in secondData:
  if (element[0][0] in firstdata_dict): #Checks in a hashMap and is thus done in O(1) generally
    print(element)
0 голосов
/ 11 апреля 2019

Начните с преобразования списка в словарь как таковой. Здесь ключи - это номера 2 и 3, а значения - это список строк, связанных с конкретным ключом в списке

def convert_to_dct(lst):

    dct = {}
    for x in lst:
        for i in range(len(x)):
            key = x[0][0]
            value = x[1][0]
            if key in dct:
                dct[key].append(value)
            else:
                dct[key] = []

    return dct

Эта функция преобразует список следующим образом

firstdata = [[["key"],["value"]],
              [[2],["two"]],
              [[3],["three"]]]
seconddata = [[["key"],["artimatic"]],
               [[2],["0+2"]],
               [[2],["1+1"]],
               [[3],["0+3"]],
               [[3],["1+2"]],
               [[3],["2+1"]]]

firstdict = convert_to_dct(firstdata)
seconddict = convert_to_dct(seconddata)

print(firstdict)
print(seconddict)
#{'key': ['value'], 2: ['two'], 3: ['three']}
#{'key': ['artimatic'], 2: ['0+2', '1+1', '1+1'], 3: ['0+3', '1+2', '1+2', '2+1', '2+1']}

Затем, чтобы получить окончательный результат, выполните

for key in firstdict.keys():
   if key in seconddict.keys():
       print(seconddict[key])
#['artimatic']
#['0+2', '1+1', '1+1']
#['0+3', '1+2', '1+2', '2+1', '2+1']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...