在一个被打乱的子列表中查找某个值的方法

3
我有一个列表,其中包含多个子列表。
items = [
    ["e",None,None],
    ["pork","pork.png","meat"],
    ["beef","b.png","meat"],
    ["cheese","c.png","not"],
    ]
items_list = ["e","beef","pork","beef"]
shuffle(items_list)

如何打印子列表中第二个或第三个值而不使用它们的索引?

for i in items_list:
    print ???

3
"可能包括一个样本输入和输出。这里你要做什么并不清楚。" - Ananth Rao
你是在问如何获取子列表的索引吗? - John
2个回答

0
你可以将items子列表存储在一个字典中,以它们的第一个元素作为索引。
from random import shuffle

items = [
    ["e",None,None],
    ["pork","pork.png","meat"],
    ["beef","b.png","meat"],
    ["cheese","c.png","not"],
]

items_dict = {u[0]: u for u in items}

items_list = ["e","beef","pork","beef"]
shuffle(items_list)

for s in items_list:
    print(s, items_dict[s])

输出

beef ['beef', 'b.png', 'meat']
e ['e', None, None]
beef ['beef', 'b.png', 'meat']
pork ['pork', 'pork.png', 'meat']

打印第二个项目(即PNG):

for s in items_list:
    print(s, items_dict[s][1])

输出

e None
beef b.png
beef b.png
pork pork.png

这是相当高效的,因为没有创建新的列表:在items_dict中的列表是与items中的相同列表对象。因此,如果您希望,可以通过itemsitems_dict来改变那些列表。

items_dict["cheese"].append("cheddar")
print(items[3])

items[0][2] = "something"
print(items_dict["e"])

输出

['cheese', 'c.png', 'not', 'cheddar']
['e', None, 'something']

你不需要使用`items_dict`,但是如果`items`很大,另一个选择就是使用嵌套的`for`循环,这会变得非常低效。
for s in items_list:
    for seq in items:
        if seq[0] == s:
            print(s, seq)
            break

输出

beef ['beef', 'b.png', 'meat']
e ['e', None, None]
beef ['beef', 'b.png', 'meat']
pork ['pork', 'pork.png', 'meat']

听起来很简单,那我该如何在第一次定义时将我的列表定义为字典呢?每个项目会像这样:['e': [None,None]],对吗? - Kia Azad

0
这样怎么样:
from random import shuffle

items = [
    ["e",None,None],
    ["pork","pork.png","meat"],
    ["beef","b.png","meat"],
    ["cheese","c.png","not"],
    ]

items_list = ["e","beef","pork","beef"]
shuffle(items_list)

for item in items_list:
    for orig_item in items:
        try:
            orig_item.index(item)
            print(item, orig_item)
        except ValueError:
            pass

输出:

beef ['beef', 'b.png', 'meat']
pork ['pork', 'pork.png', 'meat']
e ['e', None, None]
beef ['beef', 'b.png', 'meat']

这个可能比 @PM 2Ring 的答案慢一些(我没有测量),因为它有两个循环和异常处理。

使用 orig_item[1] 来访问子列表的第二个元素


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接