【问题标题】:How match index of one word to index of all other words in list return only if all index match of first word in other any word?仅当其他任何单词中第一个单词的所有索引都匹配时,如何将一个单词的索引与列表中所有其他单词的索引匹配?
【发布时间】:2017-09-23 09:49:34
【问题描述】:

我正在尝试用 python 解决一个难题,而这个难题说:

Two words “interlock” if taking alternating letters from each forms a 
new word. For example, “shoe” and “cold” interlock to form “schooled. 
interlocks word's characters can be random position ex : "iam" can be
 "mia" now if "iam" and  "boy” ==> combined word  cab be yobmia

所以如果我有一个列表:

a=["shoe","cold","schooled","any","boy","hair","iahroby","i","yani"]

在此列表中:

schooled => shoe + cold 的组合

iahroby => hair+ boy的组合

yani => any + i 的组合

所以我写的论文算法是:

根据该算法,我可以执行到第 2 步,但在第 2 步之后,我如何将一个单词的每个索引与单词的其他索引匹配,我可以使用 zip 模块、finditer 或嵌套循环来做到这一点,但问题是我不必匹配一个相同的位置索引,如 "iam"=="iam" ,索引可以在随机位置,如 "iam" 将是 "mia" ,那么我该如何解决这个问题?

我尝试的是错误的代码,还没有工作,我还在分享

a=["shoe","cold","schooled","any","s","pre","our","uorpre"]




    def hello(ae):
        for i in ae:
            yield i

    ar=hello(a)

    aq=list(ar.__next__())



    def check(tr):
        for i in tr:
            for j in i:
                if j in aq:
                    ??

    check(a)

由于模式是重复的,所以我试图实现递归方法,但这不起作用。

【问题讨论】:

  • 你的例子“iahroby”和“yani”是错误的。你应该更仔细地阅读这个谜题。
  • @StefanPochmann 是的,我知道拼图,但我自己把它弄得有点复杂。这是我可以说的自定义谜题。
  • 嗯...那你为什么说你正在尝试解决这个难题,而实际上你并没有呢?当我们不知道它是什么因为你没有告诉我们时,我们应该如何帮助你的自定义谜题?
  • @StefanPochmann 我已经非常清楚地展示了我的论文算法和示例,我解释了“iam”可以是“mia”,请阅读
  • @AyodhyankitPaul 如果我猜对了,我想你想检查一下字谜??

标签: python python-2.7 python-3.x list match


【解决方案1】:

订单被忽略

看起来你不关心字母位置。在这种情况下,您只需要检查来自word1 和word2 的字母是否与来自goal 的字母相加。由于您不关心位置,因此对字母进行排序就足够了:

words = ["shoe","cold","schooled","any","s","pre","our","uorpre"]

for goal in words:
    lg = len(goal)
    goal_letters = sorted(goal)
    for word1 in words:
        l1 = len(word1)
        if lg > l1:
            for word2 in words:
                if word2 > word1 and len(word2) == lg - l1:
                    if sorted(word1 + word2) == goal_letters:
                        print('%s + %s = %s' % (word1, word2, goal))

它输出:

cold + shoe = schooled
boy + hair = iahroby
any + i = yani

它效率不高,但它适用于您的示例。

考虑顺序

如果考虑到顺序,您可以将单词与::2 和1::2 分开并检查它们是否是已知单词(感谢@StefanPochmann):

words = set(["shoe", "cold", "schooled", "any", "boy", "hair", "iahroby", "i", "yani"])

for goal in words:
    word1 = goal[::2]
    word2 = goal[1::2]
    if word1 in words and word2 in words:
      print('%s * %s = %s' % (word1, word2, goal))
# shoe * cold = schooled

它输出:

shoe * cold = schooled

【讨论】:

  • 对于“考虑到顺序”,最好使用正常的解决方案,测试goal[::2]和goal[1::2]是否都在单词集中。效率更高,并且还可以处理奇数长度的目标词。
  • 但是您的第二个解决方案没有通过所有测试用例:p
  • @AyodhyankitPaul 是哪一个?
  • 先生,第二个 :) 因为它只打印鞋 * 冷 = 受过教育而不是其他词
  • @AyodhyankitPaul 好吧,是的,因为其他词的排序不正确。这就是这两种方法的区别。
猜你喜欢
  • 1970-01-01
  • 2020-11-27
  • 2014-07-04
  • 1970-01-01
  • 1970-01-01
  • 2018-10-24
  • 1970-01-01
  • 2017-10-27
  • 1970-01-01
相关资源
最近更新 更多