Python 迭代问题!

标签 python iteration

我这里有这段代码,它应该从列表 n1 和 n2 中删除公共(public)字母。但是当我运行这段代码时,它只运行一次,因为它只从 n1 和 n2 中删除了 'a' 而没有删除 'k'。

澄清一下,这段代码应该始终只对 2 个词起作用。

name1 = "abdjek"
name2 = "doarhsnk"

n1l = list(name1)
n2l = list(name2)

for i in range(len(n1l)):
   for j in range(len(n2l)):
         if n1l[i] == n2l[j]:
               n1l.pop(i)
               n2l.pop(j)
               n1l.append('0')
               n2l.append('1')

好吧,等等,它似乎适用于上述 2 个名称,但是当我有 name1 = "naveen"和 name2 = "darshana"时,它不起作用!

最佳答案

我建议一个更简单的方法:

def removecommon(name1, name2):
  common = set(name1).intersection(name2)
  res1 = ''.join(n for n in name1 if n not in common)
  res2 = ''.join(n for n in name2 if n not in common)
  return res1, res2

n1, n2 = removecommon('naveen', 'darshana')
print n1, n2

根据需要发出 vee drsh

编辑:正如 OP 现在指定的那样(在评论中——请记得也编辑您的问题,哦 OP!)他实际上只想删除first出现在每个普通字母的每个词中,所需的算法当然是完全不同的。一个简单的方法(如果单词的长度不是太长是可行的):

def removefirstcommon(name1, name2):
  common = set(name1).intersection(name2)
  n1 = list(name1)
  for c in common: n1.remove(c)
  n2 = list(name2)
  for c in common: n2.remove(c)
  return ''.join(n1), ''.join(n2)

一个更精细的方法(虽然对于正常长度的单词来说速度较慢)对于极长的单词来说会更快(因为下面是 O(N) 而前者是 O(N 平方)):

def removefirstcommonlongwords(name1, name2):
  common = set(name1).intersection(name2)
  def mustrem(c, copycom):
    res = c not in copycom
    copycom.discard(c)
    return res
  cop = set(common)
  n1 = [c for c in name1 if mustrem(c, cop)]
  n2 = [c for c in name2 if mustrem(c, common)]
  return ''.join(n1), ''.join(n2)

关于Python 迭代问题!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2173238/

相关文章:

python - 如何在 plotly 中更改直方图的边缘颜色?

python - DataFrame GroupBy 多级选择

Python plotly : Slider not Refreshing Scatter Plot

mongodb - 如何统计mongodb中游标的迭代次数?

go - 迭代结构并执行数据库查询

python - 当程序终止或 pc 关闭时调用函数

python - 如何使用numpy从2D图像矩阵生成所有(x,y,像素值)元组的列表?

python - 简化 pandas 中大文件的处理

python - 为什么这些字符串从我在 python 中的正则表达式中转义?

xslt - 基于计数的迭代或 XSL 中的复制。我该怎么做?