根据逻辑从多个列表的相同索引位置移除所有值

1 投票
7 回答
1436 浏览
提问于 2025-04-16 16:40

我刚开始学习编程,也刚开始学习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]

如果有人能帮我,我会非常感激。这些列表只是举个例子,但我需要处理的列表会有很多重复的房间,我需要对每一个都做同样的处理。

补充说明:首先,感谢大家的快速回复。另一方面,我忘了提一个小细节,但这并不重要。我要使用一个非常老的解释器,Jython 2.2版本。所以,有些功能可能对我来说不适用。

7 个回答

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

-编辑- 它会找到价格中最高的值,然后找到这个值的位置,再把这个位置从所有列表中删除。-编辑-

1

正如Jochen在评论中提到的,写一个类来存储你的信息可能会更好。每个类的实例可以存储与一个房间相关的所有信息。

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)]

撰写回答