Как использовать условие в массиве словаря для извлечения элементов из другого массива в том же словаре? - PullRequest
1 голос
/ 17 апреля 2019

У меня есть словарь массивов.

mydict={'a':[45,65,78,32], 'b':['red','blue','green','yellow'], 'c':[3.4, 4.5, 6.5, 7.6]}

Я хочу получить элементы mydict['b'], когда mydict['a'] больше 35.Я хочу

myarr = ['red','blue','green']

Я пытался -

myarr = [mydict['b'] for num in mydict['a'] num > 35]

Я не хочу идти по пути C ++ / C для перечисления и сохранения индекса и использования индекса.Не похоже на Python.

Как мне это сделать?

Ответы [ 5 ]

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

Создать новый list, если значение dict['a'] > 35:

mydict = {'a':[45,65,78,32], 'b':['red','blue','green','yellow'], 'c':[3.4, 4.5, 6.5, 7.6]}

Python 3.x :

Использование itertools.zip_longest(*iterables, fillvalue=None):

Из документов :

Создайте итератор, который объединяет элементы из каждого из итераций. Если итерации имеют неравную длину, пропущенные значения заполняются с fillvalue. Итерация продолжается до тех пор, пока самая длинная итерация не будет истощен

print([y for x,y in zip_longest(mydict['a'],mydict['b']) if x > 35])

Python 2.x :

Использование itertools.izip_longest(*iterables[, fillvalue])

print([y for x,y in izip_longest(mydict['a'],mydict['b']) if x > 35])

OUTPUT

['red', 'blue', 'green']

EDIT

В чем разница между zip() и zip_longest()?

Рассмотрим следующие списки:

x = [1,2,3,4,5]    
y = ['a','b','c']

for a,b in zip(x,y):
    print(a,b)

OUTPUT

1 a
2 b
3 c

Он явно пропустил элементы 4,5 в x, поскольку не смог найти соответствующие им элементы в y.

Использование zip_longest():

x = [1,2,3,4,5]    
y = ['a','b','c']

for a,b in zip_longest(x,y):
    print(a,b)

OUTPUT

1 a
2 b
3 c
4 None
5 None

Он не пропустил элементы в x, вместо этого заполнил недостающие в y None.

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

вы близки, вам нужно использовать zip:

[b for a, b in zip(mydict['a'], mydict['b']) if a > 35]
1 голос
/ 17 апреля 2019

Если вы открыты для использования pandas, этот тип фильтрации довольно прост.

Первый проход mydict в конструктор DataFrame:

import pandas as pd
df = pd.DataFrame(mydict)
print(df)
#    a       b    c
#0  45     red  3.4
#1  65    blue  4.5
#2  78   green  6.5
#3  32  yellow  7.6

Теперь используйте логическую маску для фильтрации столбцов , которые удовлетворяют вашему условию:

print(df[df['a']>35])
#    a      b    c
#0  45    red  3.4
#1  65   blue  4.5
#2  78  green  6.5

Чтобы получить желаемый вывод в виде списка, вы можете сделать:

myarr = df[df['a']>35]['b'].values.tolist()
print(myarr)
#['red', 'blue', 'green']
1 голос
/ 17 апреля 2019

Попробуйте это:

[j for i,j in zip(mydict['a'],mydict['b']) if i>35] 
1 голос
/ 17 апреля 2019

Вы можете использовать enumerate для доступа к соответствующему индексу i, используя который вы можете получить соответствующее значение из mydict['b'].

myarr = [mydict['b'][i]  for i, num in enumerate(mydict['a']) if num > 35]
# ['red', 'blue', 'green']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...