1

我有一个大约一百个字符串的列表,每个字符串在 2 个 for 循环中相互比较,这是代码的一个非常基本的概述:

string_list = ["PII", "AZO", "CVCO", "MOD"]

for x in string_list:
    for y in string_list:
        if x != y:
            print (x, y)

哪个打印:

PII AZO
PII CVCO
PII MOD
AZO PII
AZO CVCO
AZO MOD
CVCO PII
CVCO AZO
CVCO MOD
MOD PII
MOD AZO
MOD CVCO

如您所见,很多字符串被比较了两次(PII - AZO 和 AZO - PII 等)

我一直在试图弄清楚如何使用 2 个计数变量来避免这个问题,但我摸不着头脑,必须有一种更简单/pythonic 的方法来做到这一点,所以没有重叠的字符串比较,有谁知道如何完成这个?

Python 3,谢谢。

编辑:

预期结果:

PII AZO
PII CVCO
PII MOD
AZO CVCO
AZO MOD
CVCO MOD
4

2 回答 2

10

使用itertools.combinations()

>>> string_list = ["PII", "AZO", "CVCO", "MOD"]
>>> from itertools import combinations
>>> for a, b in combinations(string_list, 2):
...     print(a, b)
... 
PII AZO
PII CVCO
PII MOD
AZO CVCO
AZO MOD
CVCO MOD

您的版本改为生成排列。

于 2013-07-03T22:35:30.377 回答
2

您可以手动执行此操作的方法是迭代第二个列表,从第一个列表的索引之后开始:

import itertools

for i, x in enumerate(string_list):
    for y in itertools.islice(string_list, i + 1, None)
        # if you don't have duplicates, this next check isn't necessary
        if x != y:
            print(x, y)

itertools.islice(list, start, stop)就像list[start:stop],但不复制。感谢指出这一点的评论者。

于 2013-07-03T22:39:36.627 回答