【发布时间】:2013-11-21 05:48:18
【问题描述】:
我正在尝试编写一个脚本来计算一个短字符串或“kmer”的所有可能的模糊字符串匹配匹配,而在 Python 2.7.X 中工作的相同代码给了我一个不确定的答案使用 Python 3.3.X,我不知道为什么。
我在我的代码中遍历字典、itertools.product 和 itertools.combinations,但我遍历所有这些以完成,没有中断或继续。此外,我将所有结果存储在单独的字典中,而不是我正在迭代的字典中。简而言之 - 我没有犯任何对我来说很明显的错误,那么为什么 Python2 和 Python3 之间的行为不同?
下面是稍微简化的示例代码:
import itertools
def find_best_fuzzy_kmer( kmers ):
for kmer, value in kmers.items():
for similar_kmer in permute_string( kmer, m ):
# Tabulate Kmer
def permute_string( query, m ):
query_list = list(query)
output = set() # hold output
for i in range(m+1):
# pre-calculate the possible combinations of new bases
base_combinations = list(itertools.product('AGCT', repeat=i))
# for each combination `idx` in idxs, replace str[idx]
for positions in itertools.combinations(range(len(query_list)), i):
for bases in base_combinations:
# Generate Permutations and add to output
return output
【问题讨论】:
-
请给出一个有问题的输入的具体例子,以及你在两个 Python 下得到的输出。 “非确定性”对您来说可能很清楚,但我们不知道您的意思 ;-)
-
我的猜测是它与字典和集合有关。字典是一组键:值对。集合是无序的,这意味着您不能依赖实现中对象的顺序。我在想的是,python 3 以与 python 2 不同的方式实现这两个东西。如果您的实现依赖于 dict 或 set 的顺序,那么您不应该使用它们。
-
“我没有犯任何对我来说很明显的错误” 现在你知道了:迭代字典并假设它在迭代顺序上有 any 保证 是一个明显的错误。如果您想对订单进行保证,请使用
OrderedDict或仅使用list(the_dict.items())(顺便说一下,它使用的内存比OrderedDict少)。 -
@Bakuriu,请注意
list(the_dict.items())不会强制执行命令;sorted(the_dict.items())当然可以。 -
@TimPeters 是的,我的意思是
sorted。我不知道为什么我写了一个普通的list...
标签: python string python-3.x bioinformatics non-deterministic