我是编程的初学者,也是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版进行编码。因此,某些功能可能对我不起作用。
答案 0 :(得分: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-
答案 1 :(得分: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
上工作,而不是像上面最后一行那样来回转换......
答案 2 :(得分:0)
您可以通过指定两个索引来获取列表的子集,称为“切片”。返回值是包含列表的所有元素的新列表,从第一个切片索引开始,直到但不包括第二个切片索引。如果省略第二个索引,它将继续到列表的末尾,例如
Rooms = Rooms[1:]
房间将等于
Rooms = ['RedRoom', 'GreenRoom', 'BlueRoom']
答案 3 :(得分:0)
CurrentRoom = Rooms.pop(0)
将从列表中取出第一项并将其保存在CurrentRoom中。如果您不需要保留或使用它,只需Rooms.pop(0)
答案 4 :(得分:0)
我真的鼓励你使用不同的解决方案,你想做什么,我认为是可能的,但它不优雅和可维护。
如果您创建一个类来代表您的房间并且只使用一个房间列表,我认为会更好。
答案 5 :(得分: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个元素的列表副本,请使用list_name[0:n]+list_name[n+1:]
而不是del语句。将结果分配给您选择的变量,如new_rooms = rooms[0:i]+rooms[i+1:]
答案 6 :(得分:0)
正如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)]