【群聊科普】PHP和Python是怎么对数组去重的?

在我的面向小白的PHP免费视频课(http://codeslator.edusoho.cn/my/course/3)中,我介绍了PHP数组,于是就有学过Python的朋友开始在群里讨论PHP和Python都是如何对数组去重的。


我在这里给大家简单分析一下,需要说明的人,我们都是以两个编程语言内置的函数举例的,而且大家可以分别前往在线的编程环境中练习,不必自己安装本地的编程环境。


先来看PHP:

<?php

$words = array("China","US","Japan","US","Korea");

print_r(array_unique($words));

 
?>


https://c.runoob.com/compile/1


把上面这段代码粘贴到上面的网址中,可以看出来,多出来的那个US被过滤掉了


/coding/uploads/files_user1/question/5f1fb69f26887848047.png


然后再来看Python:

# -*- coding: UTF-8 -*-
words = ["China","US","Japan","US","Korea"]

new_words = list(set(words))

print new_words


https://c.runoob.com/compile/6


可以把上面的这段代码粘贴到上面的网址中,然后发现多余的US被过滤掉了,但同时单词的顺序也改变了


这种情况在翻译实践中很常见,比如你有一个术语库,术语库里有很多重复的术语,你不希望重复的术语也展示出来,这个时候就需要去重。


群友Edgar Z.说Python可以这样解决:if not in, append


他说的意思是:


在以下网址中输入以下代码:


https://c.runoob.com/compile/6


# -*- coding: UTF-8 -*-
words = ["China","US","Japan","US","Korea"]

new_words = []
for i in words:
 if i not in new_words:
  new_words.append(i)

print new_words


/coding/uploads/files_user1/question/5f1fb72e69e33943945.png


意思是:


有两个盒子:一个盒子里装了很多单词,另外一个盒子里是空的。


从第一个盒子里一个个的取单词,每取一个,就看看这个单词有没有在第二个盒子里,如果没有的吧,就把这个单词放到第二个盒子里。


从而保证第二个盒子里肯定没有重复的单词。


这个是Python里的。初学者还没有学到判断和循环的时候可以不必在意这个例子,进度有些超前。


后面我会重点介绍判断和循环


如果用PHP来写的话就是这样:

<?php
$words = array("China","US","Japan","US","Korea");

$new_words = array();

foreach($words as $i)
{
	if(!in_array($i,$new_words))
	{
	   $new_words[] = $i;
	}
}

print_r($new_words);
?>


在这个网址中运行上述代码:


https://c.runoob.com/compile/1


截图:


/coding/uploads/files_user1/question/5f1fb80e195c3417547.png


要想理解这段代码需要知道的基础知识:


1) foreach循环
2) ! 叹号的作用

3) in_array()函数

4) 使用$new_words[] = 这种方式往数组里添加元素



已邀请:

韩林涛 - 《译者编程入门指南》作者

群友张永旺还提供了一个使用Python去重的例子:

# -*- coding: UTF-8 -*-
words = ["China","US","Japan","US","Korea"]
words = list(dict.fromkeys(words))
print(words)


效果:


/coding/uploads/files_user1/answer/5f1fb8fa32c36749793.png

韩林涛 - 《译者编程入门指南》作者

关于Python的set()函数去重后顺序混乱的原因:


这个跟python的数据类型有关,在Python中有一种有序集合叫列表,英语叫list,比如:


words = ["China","US","Japan","US","Korea"]


这就是一个列表。


然后在Python中我们去做去重的时候一般会用到set函数,而在Python中还有一种集合叫无序集合,set就是一种无序集合。


在创建一个无序集合set的时候,需要输入一个list,所以才有这一行代码:


new_words = list(set(words))


其中的set(words)就是把有序集合变成了无序集合。


去重之后,我们再次把无序集合set变成list:


new_words = list(set(words))


然后输出。


这个时候你就发现最开始的那个列表里面已经不是最开始的顺序了。


要回复问题请先登录注册