使用嵌套for循环比较列表中的项

0 投票
2 回答
3562 浏览
提问于 2025-04-18 07:14

我有一个打开的CSV文件,里面有一堆网址,我把这些网址按字母顺序排好了。现在我想逐个检查这些网址,看看有没有重复的。接下来,我还想把重复的网址从列表中删掉,但我现在卡在检查这一步上。我尝试用嵌套的for循环来解决这个问题,代码如下:

for i in short_urls:
    first_url = i
    for s in short_urls:
        second_url = s
    if i == s:
       print "duplicate"
    else:
       print "all good"

当这个嵌套的for循环能正常工作后,print语句会被替换掉。目前,这个列表里有一些重复的网址,但我的嵌套循环似乎没有正确工作,因为它没有识别出任何重复的网址。

我想问的是:有没有更好的方法来完成这个任务?现在这个嵌套for循环的问题出在哪里?

非常感谢 :)

2 个回答

0
if i == s:

这个代码没有在第二个for循环里面。你漏掉了缩进。

for i in short_urls:
    first_url = i
    for s in short_urls:
        second_url = s
        if i == s:
           print "duplicate"
        else:
           print "all good"

补充说明:你现在是把数组里的每个元素都和同一个数组里的每个元素进行比较。这就意味着你在比较位置0的元素和位置0的元素,显然它们是一样的。你需要做的是,让第二个for循环从第一个for循环已经到达的位置的下一个位置开始。

2

你的方法本身就有问题,即使你把 if/else 代码块缩进得很正确。举个例子,假设你的 short_urls[1, 2, 3]。外层的 for 循环会选择 1 来和列表进行比较。在内层的 for 循环中,当它遇到第一个元素 1 时,它会“认为”找到了一个重复的元素。实际上,每个元素都会被标记为重复,如果你打算去掉重复项,最后你会得到一个空列表。

更好的解决办法是使用 set(short_urls) 来获取一个去掉重复项的 set。如果你想要一个去掉重复项的 list(而不是 set),你可以用 list(set(short_urls))set 转换回 list

换句话说:

short_urls = ['google.com', 'twitter.com', 'google.com']
duplicates_removed_list = list(set(short_urls))
print duplicates_removed_list # Prints ['google.com', 'twitter.com']

撰写回答