Как я могу выполнять арифметические операции между элементами двух списков без общего ключа в Python 2.7 - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть два списка с разными атрибутами.Однако окончательный результат рассчитывается на основе комбинации двух атрибутов, выбирающих по одному из каждого списка.Между ними нет общего ключа.Вот мой код:

import math
import json

# First list
with open("acc.json") as data_file:

    list1 = [json.loads(line) for line in data_file]

for acce in list1:
    Xaxis = float(format(float(acce['dataX']),'.4f'))
    Yaxis = float(format(float(acce['dataY']),'.4f'))
    Zaxis = float(format(float(acce['dataZ']),'.4f'))


    #Second list

with open("gyro.json") as data_file2:

   list2 = [json.loads(line) for line in data_file2]

for gyro in list2:
    pitch=float(format(float(gyro['dataX']),'.4f'))
    roll=float(format(float(gyro['dataY']),'.4f'))
    yaw=float(format(float(gyro['dataZ']),'.4f'))

    gX=float(-g * math.cos(pitch)*math.sin(roll))
    gY=float(-g * math.sin(pitch))
    gZ=float(g * math.cos(pitch) * math.cos(roll))

#Below code is not working

for (k,v),(k2,v2) in zip(my_dict.iteritems(), my_dict2.iteritems()):

    linAcceX=float((Xaxis-gX)/g)
    linAcceY=float((Yaxis-gY)/g)
    linAcceZ=float((Xaxis-gZ)/g)

    print linAcceX,"--",linAcceY,"--",linAcceZ

Я получаю ошибку:

for (k,v),(k2,v2) in zip(my_dict.iteritems(), my_dict2.iteritems()):
AttributeError: 'list' object has no attribute 'iteritems'    

В данный момент я использую Python 2.7.Я написал встроенные комментарии, насколько это возможно.Оба кода списка работают нормально по отдельности.

INPUT файл 'acc.json'

{"dataX":"- 0.9621435403823853","dataY":"2.9307477474212646","dataZ":"8.861872673034668"}
{"dataX":"-1.1992958784103394","dataY":"3.096036195755005","dataZ":"8.895410537719727"}
{"dataX":"-2.95518159866333","dataY":"2.7582736015319824","dataZ":"6.964654445648193"}

'gyro.json'

{"dataX":"0.07588004320859909","dataY":"0.06340815126895905","dataZ":"-0.08991656452417374"}
{"dataX":"-0.010938923805952072","dataY":"0.12412817031145096","dataZ":"0.036317165940999985"}
{"dataX":"-0.054614730179309845","dataY":"0.015471287071704865","dataZ":"0.00968557596206665"}

Это фактические данные, поэтомучто вывод кажется реалистичным.

1 Ответ

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

То, что вы называете my_dict, не является словарем, поэтому у него нет метода iteritems.Это список, с которым вы правильно перебираете:

for acce in my_dict:
    ...

Для перебора двух списков вместе используйте

for acce, gyro in zip(my_dict, my_dict2):
    # access items like you do before
    # acce['dataX']
    # within this loop you might be able to do

    for (k,v),(k2,v2) in zip(acce.iteritems(), gyro.iteritems()):
        ...

Чтобы полностью проверить это, мне нужно будет восстановить ваши списки или JSONструктур.Вам может потребоваться предоставить минимальный пример с реальными данными вместе с ожидаемыми результатами (возможно, вы можете пропустить все детали math, поскольку основное внимание уделяется итерации по структурам данных.

С вашими примерами - копируйте-n-paste в качестве списков словарей. (PY3)

In [1]: list1=[{"dataX":"- 0.9621435403823853","dataY":"2.9307477474212646","dataZ":"
   ...: 8.861872673034668"}, 
   ...: {"dataX":"-1.1992958784103394","dataY":"3.096036195755005","dataZ":"8.8954105
   ...: 37719727"}, 
   ...: {"dataX":"-2.95518159866333","dataY":"2.7582736015319824","dataZ":"6.96465444
   ...: 5648193"}]                                                                   
In [2]: list2=[{"dataX":"0.07588004320859909","dataY":"0.06340815126895905","dataZ":"
   ...: -0.08991656452417374"}, 
   ...: {"dataX":"-0.010938923805952072","dataY":"0.12412817031145096","dataZ":"0.036
   ...: 317165940999985"}. 
   ...: {"dataX":"-0.054614730179309845","dataY":"0.015471287071704865","dataZ":"0.00
   ...: 968557596206665"}]                                                           
  File "<ipython-input-2-91a4ce8928da>", line 3
    {"dataX":"-0.054614730179309845","dataY":"0.015471287071704865","dataZ":"0.00968557596206665"}]
    ^
SyntaxError: invalid syntax

In [3]: list2=[{"dataX":"0.07588004320859909","dataY":"0.06340815126895905","dataZ":"
   ...: -0.08991656452417374"}, 
   ...: {"dataX":"-0.010938923805952072","dataY":"0.12412817031145096","dataZ":"0.036
   ...: 317165940999985"}, 
   ...: {"dataX":"-0.054614730179309845","dataY":"0.015471287071704865","dataZ":"0.00
   ...: 968557596206665"}] 

In [4]: for x, y in zip(list1, list2): 
   ...:     for (k,v),(k2,v2) in zip(x.items(), y.items()): 
   ...:         print(k,k2,v,v2) 
   ...:                                                                              
dataX dataX - 0.9621435403823853 0.07588004320859909
dataY dataY 2.9307477474212646 0.06340815126895905
dataZ dataZ 8.861872673034668 -0.08991656452417374
dataX dataX -1.1992958784103394 -0.010938923805952072
dataY dataY 3.096036195755005 0.12412817031145096
dataZ dataZ 8.895410537719727 0.036317165940999985
dataX dataX -2.95518159866333 -0.054614730179309845
dataY dataY 2.7582736015319824 0.015471287071704865
dataZ dataZ 6.964654445648193 0.00968557596206665

Я использую py3, поэтому используйте item() вместо iteritems().

...