Python: деление значений вложенного списка со значениями со значениями словаря - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть список:

mylist = [['A',4,2,5], ['C',3,9,5], ['D',2,5,6]]

И словарь:

mydict = {'A' : 2, 'B' : 6, 'C' : 3}

Я хочу разделить вложенный список со значением mydict, если первое значение вложенного спискасочетается с ключом mydict.

mylist2 должен выглядеть следующим образом:

mylist2 = [['A',2,1,2.5], ['C',1,3,1.66666666667], ['D',2,5,6]]

Я новичок в Python и много пробую, например, это, но это не сработало:

mylist2 = []
for item in mylist:
    if item[0] == list(mydict.keys()):
        mylist2 = mylist[0][1:] / list(mydict.keys())
print(mylist2)

Ответы [ 4 ]

0 голосов
/ 10 декабря 2018

Hii BT Я использовал понимание списка для вашего требования, если вы хотите попробовать это:

  mydict = {'A' : 2, 'B' : 6, 'C' : 3}
  mylist = [['A',4,2,5], ['C',3,9,5], ['D',2,5,6]]

  print map(lambda x:map(lambda y:float(y/mydict.get(x[0],1)) if not isinstance(y,str) else y,x),mylist) 

  Result:[['A', 2.0, 1.0, 2.0], ['C', 1.0, 3.0, 1.0], ['D', 2.0, 5.0, 6.0]]

Я надеюсь, вам не нужно объяснение этого, функция карты просто картыс каждым элементом в списке

0 голосов
/ 10 декабря 2018

Один символ (item[0]) не может быть равен списку всех dict.keys(), который будет ['A','B','C']:

if item[0] == list(mydict.keys()):

Необходимо проверить,item[0] - это in дикт:

mylist = [['A',4,2,5], ['C',3,9,5], ['D',2,5,6]] 

mydict = {'A' : 2, 'B' : 6, 'C' : 3}

mylist2 = []
for item in mylist:
    key, *vals = item   # split into key and rest of list
    if key in mydict:
        mylist2.append([key])  # create new list, append it, fill it with key
        for val in vals:
            mylist2[-1].append(val/mydict[key])  # add the other numbers to last inner list
    else:
        mylist2.append(item[:])  # add a copy of item
print(mylist2)

Вывод:

[['A', 2.0, 1.0, 2.5], ['C', 1.0, 3.0, 1.6666666666666667], ['D', 2, 5, 6]]

Это «длинная» версия - вы можете уменьшить ее, используя dict.get(key,1)который возвращает значение ключа или 1 по умолчанию и список комп для того, чтобы сделать его «гладким» - см. Tobias_k решение

0 голосов
/ 10 декабря 2018

Вы можете использовать понимание вложенного списка, используя key, *rest для распаковки элементов mylist и используя dict.get для получения делителя или 1 по умолчанию:

>>> [[key] + [x/mydict.get(key, 1) for x in rest] for key, *rest in mylist]
[['A', 2.0, 1.0, 2.5],
 ['C', 1.0, 3.0, 1.6666666666666667],
 ['D', 2.0, 5.0, 6.0]]
0 голосов
/ 10 декабря 2018

Что-то вроде (быстрое и грязное, возможно, более элегантное решение, но, надеюсь, оно вам поможет):

mydict = {'A' : 2, 'B' : 6, 'C' : 3}
mylist = [['A',4,2,5], ['C',3,9,5], ['D',2,5,6]]

for k,v in mydict.items():
    for j in mylist:
        if k == j[0]:
            j[1] = j[1] / v
            j[2] = j[2] / v
            j[3] = j[3] / v

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