【问题标题】:find multiple substrings in string preserving appearance order [closed]在字符串保留外观顺序中查找多个子字符串[关闭]
【发布时间】:2021-03-27 21:57:20
【问题描述】:

我有一个包含以下 ids:values 的数组。

例如:

[3] '你好'
[24] '给我讲个笑话'
[34] '我很无聊'
[42] '现在几点'
[56]'你好吗'
[69]'你在做什么'

我还有一些用户输入可能包含数组的多个值,例如:

'你好,晚上好。你好吗。我很无聊,需要一些 娱乐。请给我讲个笑话。'

我能够找到所有匹配项,但顺序不正确。

预期结果将与它们在输入字符串中出现的顺序相同

例如

“你好”、“你好吗”、“我很无聊”、“给我讲个笑话”

【问题讨论】:

标签: python sql arrays string match


【解决方案1】:

遍历字典并使用in 运算符查看每个短语是否在输入中。如果是,请使用index 方法找出位置,以便您可以按该索引对结果进行排序。然后你可以从最终结果中删除索引,这样你就只有 id 和值的元组。

>>> user_input = 'hello and good evening. how are you. im bored and need some entertainment. please tell me a joke.'
>>> data = {
...     3: 'hello',
...     24: 'tell me a joke',
...     34: 'im bored',
...     42: 'what time is it',
...     56: 'how are you',
...     69: 'what are you doing',
... }
>>>
>>> [(k, v) for _, k, v in sorted(
...     (user_input.index(v), k, v)
...     for k, v in data.items()
...     if v in user_input
... )]
[(3, 'hello'), (56, 'how are you'), (34, 'im bored'), (24, 'tell me a joke')]

或者,由于您已经拥有告诉您每个 id 的字符串的数据库,您可以像这样计算 id 列表:

>>> [k for _, k in sorted(
...     (user_input.index(v), k)
...     for k, v in data.items()
...     if v in user_input
... )]
[3, 56, 34, 24]

然后你当然可以拿这份清单做如下事情:

>>> " ".join(data[i] for i in [3, 56, 34, 24])
'hello how are you im bored tell me a joke'

【讨论】:

  • 你怎么知道有字典?
  • id: value 的映射强烈暗示某种字典。如果没有一个,那么第 0 步就是制造一个。 :)
  • 非常感谢 Samwise。完美运行。 :) 我必须检查如何将 sql 结果转换为字典并意识到它不接受重复的键。我在数据数组中有重复的键,因为这些是类别 ID。我更改了适合您的解决方案的代码。非常非常感谢你! :)
猜你喜欢
  • 1970-01-01
  • 2020-10-19
  • 2014-08-12
  • 1970-01-01
  • 2015-10-03
  • 2017-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多