【问题标题】:Unable to match tuples items to list items无法将元组项目与列表项目匹配
【发布时间】:2016-07-23 13:23:18
【问题描述】:

我有一个整数列表(标签)。我想将列表项映射到字典(类)的值项并获取相应的字典键作为输出。

我正在使用:

h = classes.items()
for x in tags:
    for e in h:
        # print x, e,  # uncomment this line to make a diagnosis
        if x == e[1]:
            print e[0]
        else:
            print "No Match"

Classes 是字典。 Tags 是包含我想与类映射的项目的列表。当我运行这段代码时,我在输出中得到了 2616 次 No Match

2616 = 8 (no. of tuples)*327 (no. of items of tags list)

【问题讨论】:

  • 尝试在 if 语句之前添加一行 print x,e。这将帮助您了解比较不起作用的原因。您可能希望在此处分享您的输出摘录以获得帮助。
  • 你能发布class.items()tags的样本吗?
  • @gauden 先生,我得到了:liverpool@gandalf:~/rise/rise$ python test.py 7 Traceback(最近一次调用最后):文件“test.py”,第 57 行,在 print x, e NameError: name 'e' is not defined 这是有道理的,因为变量 e 是在第二个 'for' 循环内启动的。
  • 您真的想将标签映射到字典键并将其存储到某个对象,还是只想打印它们?
  • @IronFist 示例数据:class.items() = [('Ford', 1), ('Nissan', 0), ('Mazda', 4), ('Ferrari', 2 ), ('Suzuki', 3), ('Honda', 5), ('Toyota', 6), ('Tesla', 7)] tags = ['0','2','1',' 3','4','7','2','0','1','6','3','2','8','4','1','2' ,'0','7','5','4','1']

标签: python list loops dictionary


【解决方案1】:

对于每个标签,您遍历所有键,并打印它是否匹配,除非您最多有一次命中。例如,如果您有 10 个项目,对于每个标签,您将打印 1 个命中和 9 个未命中。

既然要存储这些数据,最简单的方法是反转字典映射,即将 key -> value 转换为 value -> key。但是,这假定所有值都是唯一的,您的示例暗示了这一点。

def map_tags(tags, classes):
    tag_map = {value: key for key, value in classes.items()}
    return [tag_map.get(t, 'No match') for t in tags]

但是,要小心。在您的classes 示例中,值是整数,而标签是字符串。在用它们制作地图时,您希望两者匹配。如果标签是字符串,则更改

tag_map.get(t, 'No match')

tag_map.get(int(t), 'No match')

【讨论】:

    【解决方案2】:

    如果我理解你想要做什么,也许这会有所帮助

    >>> tags
    ['0', '2', '1', '3', '4', '7', '2', '0', '1', '6', '3', '2', '8', '4', '1', '2', '0', '7', '5', '4', '1']
    >>> classes
    {'Tesla': 7, 'Nissan': 0, 'Honda': 5, 'Toyota': 6, 'Ford': 1, 'Mazda': 4, 'Ferrari': 2, 'Suzuki': 3}
    

    tags 是字符串列表,而不是整数 - 所以让我们将其转换为整数列表。

    >>> tags = map(int, tags)
    

    classes 是一个字典映射汽车到整数,但我们想使用该值作为查找。我们可以反转字典(交换键和值)

    >>> classes_inverse = {v: k for k, v in classes.items()}
    

    这就是 tagsclasses_inverse 的样子

    >>> tags
    [0, 2, 1, 3, 4, 7, 2, 0, 1, 6, 3, 2, 8, 4, 1, 2, 0, 7, 5, 4, 1]
    >>> classes_inverse
    {0: 'Nissan', 1: 'Ford', 2: 'Ferrari', 3: 'Suzuki', 4: 'Mazda', 5: 'Honda', 6: 'Toyota', 7: 'Tesla'}
    

    现在我们可以为列表中的每个项目收集逆字典的值。

    >>> [classes_inverse.get(t, "No Match") for t in tags]
    ['Nissan', 'Ferrari', 'Ford', 'Suzuki', 'Mazda', 'Tesla', 'Ferrari', 'Nissan', 'Ford', 'Toyota', 'Suzuki', 'Ferrari', 'No Match', 'Mazda', 'Ford', 'Ferrari', 'Nissan', 'Tesla', 'Honda', 'Mazda', 'Ford']
    

    【讨论】:

    • 非常感谢。问题在于tags 是一个字符串列表,而我在 for 循环中将字符串与整数进行比较。感谢无数的map 函数。转换后它就像一个魅力。
    猜你喜欢
    • 2011-02-05
    • 2015-05-25
    • 1970-01-01
    • 2012-12-30
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    相关资源
    最近更新 更多