【问题标题】:How to convert a list word to a dictionary key and to a string at end [closed]如何将列表词转换为字典键并在末尾转换为字符串[关闭]
【发布时间】:2021-01-30 06:06:20
【问题描述】:

我有一个元组列表:

[(133, 101, 150), (130, 99, 225), (163, 201, 196), (212, 212, 235), (248, 128, 245), (190, 239, 125), (123, 202, 119), (107, 58, 33), (161, 135, 209), (108, 105, 192)]

还有一本字典:

{'J': (133, 101, 150), 'n': (130, 99, 225), '1': (163, 201, 196), 'r': (212, 212, 235), 'S': (248, 128, 245), '8': (65, 244, 22), 'f': (22, 213, 90), 'U': (173, 66, 188)}

我尝试并在网上搜索,如何将列表词转换为字典键并在结尾处转换为字符串,包括所有在 swift 可能的方法中相同的键(我使用巨大的列表)。我知道我需要使用列表推导或 .''join,但我不知道如何,而且不容易理解。

示例: 给定字典键和元组列表,我想获得这样的字符串(使用也在元组列表中的键完成

data: str = Jn1rS

【问题讨论】:

  • 请描述问题中的示例输入和输出,不清楚你想用给定的列表和字典实现什么。
  • 是的,我不知道你在问什么。请提供更多详细信息。
  • 好的,已编辑......
  • 它是由字典的键组成的字符串,在元组列表中具有相同的值
  • 是的,被忽略了。

标签: python string list dictionary


【解决方案1】:

您可以反转字典。即使键成为值,使值成为键。这样您就可以根据元组查找字母。

然后您可以将所有元组转换为它们所代表的字母(忽略字典中不存在的字母)并将它们连接起来以构成字符串。

>>> d = {'J': (133, 101, 150), 'n': (130, 99, 225), '1': (163, 201, 196), 'r': (212, 212, 235), 'S': (248, 128, 245), '8': (65, 244, 22), 'f': (22, 213, 90), 'U': (173, 66, 188)}
>>> dd = {v: k for k, v in d.items()}
>>> tl = [(133, 101, 150), (130, 99, 225), (163, 201, 196), (212, 212, 235), (248, 128, 245), (190, 239, 125), (123, 202, 119), (107, 58, 33), (161, 135, 209), (108, 105, 192)]
>>> ''.join([dd[t] for t in tl if t in dd])
'Jn1rS'

【讨论】:

  • 问题在于 200mb 的列表和 67 个字典元素的时间。
  • 一个小列表 pastebin.com/GFceh7gg 字典 pastebin.com/Hkms4uK7 最重要的是时间,在更短的时间内做所有事情,
  • 我会说主要瓶颈将是在join 行中创建列表。将其更改为生成器是没有意义的,因为 join 只是在内部将其转换为列表。可能一个好方法是在创建时将字符串写入文件,以避免一次将其全部存储在内存中。试试this。它有帮助吗?很可能最简单的方法是使用 numpy 来处理这样的事情。随意提供超大的 200mb 文件。
  • 虽然我建议您使用的数据和输出格式不太适合大型输入的高效执行时间。
  • 这是字典:filebin.net/0su6l8w0bbdp5st3/dataset.txt?t=l4d755hf。这是元组列表:mega.nz/file/… 这是我正在使用的脚本:pastebin.com/8zcfGQPx 我不知道是否需要切换到 numpy。
【解决方案2】:

只需遍历键、值对并选择值不匹配的键。

这样就可以了

x = [(133, 101, 150), (130, 99, 225), (163, 201, 196), (212, 212, 235), (248, 128, 245), (190, 239, 125), (123, 202, 119), (107, 58, 33), (161, 135, 209), (108, 105, 192)]

y = {'J': (133, 101, 150), 'n': (130, 99, 225), '1': (163, 201, 196), 'r': (212, 212, 235), 'S': (248, 128, 245), '8': (65, 244, 22), 'f': (22, 213, 90), 'U': (173, 66, 188)}

res = [k for k, v in y.items() if v in x]
print(''.join(res))

【讨论】:

  • 仅适用于示例,不适用于我的真实列表和字典。
  • 如果您能分享失败的输入,我将不胜感激,我可以尝试修复错误
  • 如果数据量大可以使用pastebin.com
  • 一个小列表pastebin.com/GFceh7gg字典pastebin.com/Hkms4uK7最重要的是时间,在更短的时间内做所有事情,
【解决方案3】:

另一种方法是这样做:

a = [(133, 101, 150), (130, 99, 225), (163, 201, 196), (212, 212, 235), (248, 128, 245), (190, 239, 125), (123, 202, 119), (107, 58, 33), (161, 135, 209), (108, 105, 192)]
b = {'J': (133, 101, 150), 'n': (130, 99, 225), '1': (163, 201, 196), 'r': (212, 212, 235), 'S': (248, 128, 245), '8': (65, 244, 22), 'f': (22, 213, 90), 'U': (173, 66, 188)}
s = ""
for (x, y) in b.items(): 
    if y in a: 
        s += x

print(s)

【讨论】:

  • 仅适用于示例,不适用于我的真实列表和字典。
  • 但是时机很好
  • 一个小列表 pastebin.com/GFceh7gg 字典 pastebin.com/Hkms4uK7 最重要的是时间,在更短的时间内做所有事情。
猜你喜欢
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 2018-02-23
  • 1970-01-01
  • 1970-01-01
  • 2017-09-12
  • 1970-01-01
  • 2011-07-12
相关资源
最近更新 更多