Поиск списка объектов в Python

Попробуйте .to_datetime и метод доступа dt:

import pandas as pd

data = pd.DataFrame({'year': [2018, 2018, 2018], 'month': [12, 12, 12], 'day': [1, 2, 3]})

data['weekday'] = pd.to_datetime(data[['year', 'month', 'day']]).dt.weekday

print(data)

Даю:

   year  month  day  weekday
0  2018     12    1        5
1  2018     12    2        6
2  2018     12    3        0

Обратите внимание, что день недели индексируется нулем.

79
задан DevPlayer 22 December 2016 в 15:41
поделиться

8 ответов

Можно получить список весь элементы соответствия с пониманием списка:

[x for x in myList if x.n == 30]  # list of all elements with .n==30

, Если Вы просто хотите определить, содержит ли список какой-либо элемент, который соответствует и делает это (относительно) эффективно, можно сделать

def contains(list, filter):
    for x in list:
        if filter(x):
            return True
    return False

if contains(myList, lambda x: x.n == 3)  # True if any element has .n==3
    # do stuff
109
ответ дан Ali Afshar 24 November 2019 в 10:02
поделиться

Простой, Изящный, и Мощный:

выражение генератора А в conjuction с builtin†¦ (python 2.5 +)

any(x for x in mylist if x.n == 10)

Использование встроенный Python any() , который определяется следующим образом:

любой (повторяемый) -> Возвращают True, если какой-либо элемент повторяемого верен. Эквивалентный:

def any(iterable):
    for element in iterable:
        if element:
            return True
    return False
66
ответ дан h3xStream 24 November 2019 в 10:02
поделиться

Только для полноты, давайте не забывать Самую Простую Вещь, Которая Могла Возможно Работать:

for i in list:
  if i.n == 5:
     # do something with it
     print "YAY! Found one!"
42
ответ дан Charlie Martin 24 November 2019 в 10:02
поделиться
[x for x in myList if x.n == 30]               # list of all matches
[x.n_squared for x in myList if x.n == 30]     # property of matches
any(x.n == 30 for x in myList)                 # if there is any matches
[i for i,x in enumerate(myList) if x.n == 30]  # indices of all matches

def first(iterable, default=None):
  for item in iterable:
    return item
  return default

first(x for x in myList if x.n == 30)          # the first match, if any
32
ответ дан Markus Jarderot 24 November 2019 в 10:02
поделиться
filter(lambda x: x.n == 5, myList)
27
ответ дан vartec 24 November 2019 в 10:02
поделиться

Можно использовать in для поиска объекта в наборе и понимания списка для извлечения поля, которым Вы интересуетесь. Это (работает на списки, наборы, кортежи и что-либо, что определяет __contains__ или __getitem__).

if 5 in [data.n for data in myList]:
    print "Found it"

См. также:

8
ответ дан Markus Jarderot 24 November 2019 в 10:02
поделиться

Необходимо добавить __eq__ и __hash__ метод к Вашему Data класс, он мог проверить, равны ли __dict__ атрибуты (те же свойства) и затем если их значения равны, также.

, Если Вы сделали это, можно использовать

test = Data()
test.n = 5

found = test in myList

in проверки ключевого слова, если test находится в myList.

, Если Вы только хотите к n свойство в [1 110], Вы могли бы использовать:

class Data(object):
    __slots__ = ['n']
    def __init__(self, n):
        self.n = n
    def __eq__(self, other):
        if not isinstance(other, Data):
            return False
        if self.n != other.n:
            return False
        return True
    def __hash__(self):
        return self.n

    myList = [ Data(1), Data(2), Data(3) ]
    Data(2) in myList  #==> True
    Data(5) in myList  #==> False
3
ответ дан Johannes Weiss 24 November 2019 в 10:02
поделиться

Рассмотрите использование словаря:

myDict = {}

for i in range(20):
    myDict[i] = i * i

print(5 in myDict)
3
ответ дан dan-gph 24 November 2019 в 10:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: