根据逻辑从多个列表的相同索引位置移除所有值
我刚开始学习编程,也刚开始学习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)]