Как сохранить только некоторые строки таблицы в python?

У меня есть таблица в python, скажем, например:

x.title,y.title,z.title "A","B","C" "A","A","D" "B","B","E" "B","A","F" 

Я хочу только сохранить строки, которые я указываю, например, если мне нужны только строки, где x.title = y.title (поэтому, когда значение для строки x.title равно значению для строки y.title ) , что дало бы мне:

 x.title,y.title,z.title "A","A","D" "B","B","E" 

Как вы можете видеть, только строки, в которых хранятся значения x.title = y.title. Я храню свои таблицы в словарях, поэтому эта таблица будет выглядеть так:

 {'x.title' : ["A","A","B","B"], 'y.title' : ["B","A","B","A"], 'z.title' : ["C","D","E","F"]} 

поэтому столбцы: значения под столбцом в списке.

Учтите, что это должно быть способно обрабатывать любое количество пар столбца / строки в словаре, а не только для 3, которые приведены в этом примере. Кроме того, я не могу импортировать такие вещи, как панды.

Любая помощь будет оценена по достоинству. Если есть какие-либо вопросы, пожалуйста, спросите.

EDIT: Это то, что я пробовал, но он работает только для трех пар столбцов / строк. Как я могу заставить его работать для любого количества столбцов / строк в словаре?

 data = {'x.title' : ["A","A","B","B"], 'y.title' : ["B","A","B","A"], 'z.title' : ["C","D","E","F"]} xdata = [] ydata = [] zdata = [] for (x,y,z) in zip(data['x.title'], data['y.title'], data['z.title']): if x == y: xdata.append(x) ydata.append(y) zdata.append(z) data['x.title'] = xdata data['y.title'] = ydata data['z.title'] = zdata 

2 Solutions collect form web for “Как сохранить только некоторые строки таблицы в python?”

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

 data = {'x.title' : ["A","A","B","B"], 'y.title' : ["B","A","B","A"], 'z.title' : ["C","D","E","F"]} # titles to compare titles = ['x.title', 'y.title'] # get the length of one of the lists list_len = len(data['x.title']) # loop thru the length of a list for i in xrange(list_len): # get all items at each list index items_at_i = [data[k][list_len - i - 1] for k in data if k in titles] # if the items at that index aren't unique, remove them from each list if len(items_at_i) == len(set(items_at_i)): for k in data: del data[k][list_len - i - 1] 

Я бы использовал filter для этого. Во-первых, я бы построил генератор, чтобы я мог перебирать строки таблицы. Небольшая настройка, чтобы начать …

 my_dict = {'x.title' : ["A","A","B","B"], 'y.title' : ["B","A","B","A"], 'z.title' : ["C","D","E","F"]} cols = ['x.title', 'y.title', 'z.title'] 

Генератор:

 def iter_rows(table_dict, cols): for row in zip(*(table_dict[col] for col in cols)): yield row 

Теперь, когда у меня есть генератор, мне нужна функция, которая возвращает True для условия, которое меня интересует, и False противном случае.

Функция:

 def row_filter(row): return row[0] == row[1] 

Теперь я могу filter таблицу так:

 >>> rows_of_interest = filter(row_filter, iter_rows(my_dict, cols)) >>> rows_of_interest [('A', 'A', 'D'), ('B', 'B', 'E')] 

Теперь мои строки можно вернуть обратно в мой стол:

 >>> filtered_table = dict(zip(cols, map(list, zip(*rows_of_interest)))) >>> filtered_table {'x.title': ['A', 'B'], 'y.title': ['A', 'B'], 'z.title': ['D', 'E']} 

Если вы ожидаете, что так много делаете, Панда , скорее всего, будет способ.

РЕДАКТИРОВАТЬ

Более общий способ сделать это – вместо этого использовать такой подход, как этот

 my_dict = {'x.title' : ["A","A","B","B"], 'y.title' : ["B","A","B","A"], 'z.title' : ["C","D","E","F"]} def col_dict_to_row_dict(col_dict): '''generator that yields a dictionary of (colname, rowvalue) pairs for the passed dictionary of (colname, column) pairs''' cols = col_dict.keys() for row in zip(*col_dict.values()): yield {col : row_val for col, row_val in zip(cols, row)} def row_dict_to_col_dict(row_dict): '''function that takes an iterable where each element is a dictionary of (colname, rowvalue) pairs and converts it to a dictionary of (colname, column) pairs''' row_it = iter(row_dict) try: first_row = next(row_it) except StopIteration: return {} col_dict = {col : [row_val] for col, row_val in first_row.items()} for row in row_it: for col, item in row.items(): col_dict[col].append(item) return col_dict def filter_factory(conditions): return lambda x : all(condition(x) for condition in conditions) conditions = [ lambda x : x['z.title'] == 'D', lambda x : x['z.title'] == x['y.title'] or x['z.title'] != 'F' ] >>> row_dict_to_col_dict(filter(filter_factory(conditions), col_dict_to_row_dict(my_dict))) {'x.title': ['A'], 'y.title': ['A'], 'z.title': ['D']} 

EDIT2

Из того, что я могу сказать, вы ищете функцию, которая позволяет вам делать что-то вроде этого filter_my_table(my_table, 'y.title == x.title') где my_table – словарь столбцов, подобных вашему примеру, а сопровождающая строка – любая произвольно сложный критерий фильтрации (например, 'y.title == y.title and z.title != "F"' ). Если это так (как я подозреваю, это из вашего комментария в очень похожим вопросе ), мой второй пример даст вам то, что вы хотите, с небольшой модификацией. Если вам 'x.title' ограничение, имена столбцов должны быть действительными именами Python (например, 'x.title' должно быть 'x_title' или 'xtitle' или каким-либо другим допустимым именем Python), вы можете получить то, что хотите определяя новую функцию:

 def filter_from_condition_string(condition_string): return lambda row : eval(condition_string, globals(), row) 

Изменение filter_factory() :

 def filter_factory(conditions): ffcs = filter_from_condition_string #just to shorten the next line conds = [ffcs(c) if isinstance(c, (str, unicode)) else c for c in conditions] return lambda x : all(condition(x) for condition in conds) 

и переименование столбцов, чтобы ваш новый словарь

 my_dict = {'x_title' : ["A","A","B","B"], 'y_title' : ["B","A","B","A"], 'z_title' : ["C","D","E","F"]} 

Теперь вы можете переопределить conditions как

 conditions = [ "z_title == 'D'", "x_title == y_title or z_title != 'F'" ] 

Проверяя это на консоли, мы получаем

 >>> row_dict_to_col_dict(filter(filter_factory(conditions), col_dict_to_row_dict(my_dict))) {'x_title': ['A'], 'y_title': ['A'], 'z_title': ['D']} 
  • Сгенерировать все уникальные перестановки 2d массива
  • Python: super и __init __ () vs __init __ (self)
  • Можно ли перезаписать строковую форму namedtuple?
  • Как применять границы max & min к значению без использования условных операторов
  • Запись данных на h5py на SSD-диск выглядит медленнее: что я могу сделать, чтобы ускорить ее
  • Реализация запросов «Начинается с» и «Заканчивается на» с помощью Google App Engine
  • Невозможно запустить простой helloworld в gae (python 2.7)
  • Как этот код печатает Hello World без каких-либо заявлений печати
  •  
    Interesting Posts for Van-Lav

    Разница между «данными» и «параметрами» в запросах Python?

    Python и 16 бит Tiff

    TypeError в запросе SOAP (с использованием pysimplesoap)

    Не удается войти в rosetta

    Обнаруживать, запускается ли скрипт python из оболочки ipython или запускается из командной строки

    Сколько классов Python следует поместить в один файл?

    Как отсортировать список объектов даты?

    Эффективный способ поиска отсутствующих элементов в целочисленной последовательности

    Python Flask, как установить тип содержимого

    возможно ли использовать CEF-питон в режиме безголоски для скриншотов?

    Альтернативная ссылка на стандартную библиотеку Python

    Как скрыть строку таблицы (или элемент списка) и обновить хранилище данных без перезагрузки страницы?

    Почему объект string кэшируется в python

    Как сделать JOIN в SQLAlchemy на 3 таблицах, где один из них является сопоставлением между двумя другими?

    Размещение объектов Python в общей памяти

    Python - лучший язык программирования в мире.