удалить все значения из нескольких списков в одной позиции индекса с некоторой логикой

1

Я новичок в программировании, а также новичок в Python. Ниже приведены подробности для лучшего понимания моей проблемы.

Rooms = ['BlueRoom', 'RedRoom', 'GreenRoom', 'BlueRoom']
Availability = [5, 7, 3, 5]
Description = ['Blue', 'Red', 'Green', 'Blue']
Price = [120, 90, 150, 115]

Мне нужно иметь те же списки, но с BlueRoom и всеми значениями в той же позиции индекса списков с наивысшей ценой, например:

Rooms = ['RedRoom', 'GreenRoom', 'BlueRoom']
Availability = [7, 3, 5]
Description = ['Red', 'Green', 'Blue']
Price = [90, 150, 115]

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

EDIT: Прежде всего, спасибо всем за быстрые ответы. С другой стороны, я забыл упомянуть немного, но не менее важно, подробно. Мне нужно закодировать, используя очень старый интерпретатор Jython версии 2.2. Поэтому некоторые функции могут работать не для меня.

  • 1
    Начните с написания классов, это гораздо проще, чем возиться с такими списками.
Теги:

7 ответов

0
Лучший ответ

Как отметил Йохен в комментарии, вам, вероятно, лучше написать класс для хранения вашей информации. Каждый экземпляр класса может хранить всю информацию, относящуюся к одной комнате.

class Room(object):
    def __init__(self, name, availability, description, price):
        self.name = name
        self.availability = availability
        self.description = description
        self.price = price

rooms = [Room('BlueRoom', 5, 'Blue', 120), ...]

Таким образом, вся информация об одной комнате всегда хранится вместе, и вам не нужно беспокоиться о синхронизации разных списков. Таким образом, вы можете просто искать список, чтобы найти дубликаты комнат и удалить те, которые вам не нужны.

Например, предположим, что вы хотите сохранить только номер по низкой цене, соответствующий данному описанию. То, как я это сделаю, -

import itertools

# here is where you might insert the class code from above

def namekey(room):
    return room.name
def pricekey(room):
    return room.price
sorted_rooms = sorted(rooms, namekey)

Сначала вам нужно отсортировать список номеров по имени, чтобы следующий код работал.

cheapest_rooms = []

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

for name, group in itertools.groupby(sorted_rooms, namekey):

Это разделит список комнат на под-списки по имени.

    cheapest = min(group, key=pricekey)

Это находит самую дешевую комнату из группы.

    cheapest_rooms.append(cheapest)

И это добавляет его в список.

Все это можно конденсировать в

import itertools

# here is where you might insert the class code from above

def namekey(room):
    return room.name
def pricekey(room):
    return room.price
[min(group, key=pricekey) for name, group \
      in itertools.groupby(sorted(rooms, namekey), namekey)]
1

Для работы с подобными параллельными списками я бы рекомендовал использовать zip:

room_data = zip(Rooms, Availability, Description, Price)
room_data[0]
-> ('BlueRoom', 5, 'Blue', 120)

Затем вы можете сделать некоторую логическую обработку в этом списке:

blue_rooms = [r for r in room_data if r[0] == 'BlueRoom']
best_blue_room = max(blue_rooms, key=lambda (r,a,d,p): p)
room_data.remove(best_blue_room)
Rooms, Availability, Description, Price = map(list, zip(*room_data))

Возможно, рассмотрим возможность работы непосредственно с room_data вместо преобразования его назад и вперед, как в последней строке выше...

1
Rooms = ['BlueRoom', 'RedRoom', 'GreenRoom', 'BlueRoom']
Availability = [5, 7, 3, 5]
Description = ['Blue', 'Red', 'Green', 'Blue']
Price = [120, 90, 150, 115]

highest_price = max(Price)
x = Price.index(highest_price)
list = [Rooms,Availability,Description,Price]

for item in list:
    del item[x]

print Rooms
print Availability
print Description
print Price

Я думаю, что делает то, что вам нужно.: D

-EDIT- Он находит наибольшее значение в Price. Находит индекс этого значения, затем удаляет этот индекс из всех списков. -EDIT-

  • 0
    Я думаю, что он хотел самую дорогую синюю комнату, не только самую дорогую комнату, но в остальном это кажется правильной идеей
0

Во-первых, прямой ответ на ваш вопрос: вы можете удалить элемент на месте из списка по индексу с помощью del list_name[index] или в вашем примере del Rooms[0]. Нет ни одного лайнера, использующего эту технику, чтобы удалить один и тот же индексированный элемент из всех четырех списков. Он принимает четыре оператора del.

Если ваш вопрос касается логики нахождения индекса наивысшей цены, то дело в том, что нужно сделать (представленный в псевдокоде pythony):

idx_of_highest = 0
for i in range(Price.length()):
  if Price[i] > Price[idx_of_highest]:
    idx_of_highest = i
del Room[i]
del Price[i]
del Description[i]
del Availability[i]

Это предполагает, что ваши списки не сортируются по цене и по существу в случайном порядке. Если нет, самая высокая цена - это либо первый, либо последний индекс.

Во-вторых, вам может потребоваться использовать список словарей в этом случае, или даже список классов у вас есть далеко.

Изменить: Если вы не знаете, что означает "на месте", это означает, что сам список изменяется постоянно, т.е. вы не получаете копию или частичную копию (фрагмент). Если вам нужны копии списков, то самым простым способом является использование нотации среза, например. чтобы получить копию списка с удаленным элементом n'th, используйте list_name[0:n]+list_name[n+1:] вместо оператора del. Назначьте результат переменной по вашему выбору, как в new_rooms = rooms[0:i]+rooms[i+1:]

0

CurrentRoom = Rooms.pop(0) выведет первый элемент из списка и сохранит его в CurrentRoom. Если вам не нужно сохранять или использовать его, просто Rooms.pop(0)

0

Вы можете получить подмножество списка, называемое "срезом", указав два индекса. Возвращаемое значение представляет собой новый список, содержащий все элементы списка, чтобы, начиная с первого индекса среза, до, но не включая второй индекс среза. Если вы оставите второй индекс, он будет продолжать до конца списка, например.

Rooms = Rooms[1:]

Затем комнаты будут равны

Rooms = ['RedRoom', 'GreenRoom', 'BlueRoom']
0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню