shmily1866 发表于 2020-6-18 12:00:01

请教一个列表里字符串比较的问题

这个是第12课课后题最后一问,

6. 活学活用:请使用列表推导式补充被小甲鱼不小心涂掉的部分
https://xxx.ilovefishc.com/forum/201310/12/044035qddrqkmrqod4cqmr.png


答案是:
>>> list3 = for slogan in list1 for name in list2 if slogan == name]


答案里if条件对列表里的字符串进行了比较,有几个疑惑

1.课上说字符串的比较不是比较ascell值么(好像是这么拼,这不重要),按答案的方法来讲是比较字符串首个字符的大小。

2.我自己单独试了一下答案里的比较方式, 定义了list1和list2后,输入 list1==list2   但是一直返回false,这是为啥啊,按答案的方法应该返回true啊。


求解求解,谢谢各位大佬

wp231957 发表于 2020-6-18 12:04:24

第一,是比较首字符的码值,这里可以理解为是否一致

wp231957 发表于 2020-6-18 12:05:47

第二,它俩是俩字符串的比较,要求完全一致,才是true

Twilight6 发表于 2020-6-18 12:29:52

本帖最后由 Twilight6 于 2020-6-18 12:52 编辑


课上说字符串的比较不是比较ascell值么(好像是这么拼,这不重要),按答案的方法来讲是比较字符串首个字符的大小。
说比较 ASCII 值也没错呀没错 ,你比首个字母是否相等本质 不是照样是 比较 ASCII 码值? 而 == 这个符号简单理解直接判断字符是否相同就好了,本质也是按顺序比较ASCII值

2.我自己单独试了一下答案里的比较方式, 定义了list1和list2后,输入 list1==list2   但是一直返回false,这是为啥啊,按答案的方法应该返回true啊。
你看看下面的理解吧,再试试你自己的:

几个简单列表推导式的例子吧有助于你以后理解(假设已经给出了列表 ls1,ls2):
temp =
最简单的列表推导式:将 遍历 ls1中的元素 依次赋值给 x 加入列表中去
可以分解成:
temp = []
for x in ls1:
    temp.append(x)
temp =
将遍历ls1中的元素,将符合条件的元素加的列表中
可以分解成这样:temp = []
for x in ls1:
    if <条件>:
      temp.append(x)
temp =
将 x 遍历 ls1 中的元素,然后 i 遍历 ls2 的元素 将符合条件后的 x+i 的结果依次加入列表中
可以分解成这样:temp = []
for x in ls1:
    for i in ls2:
      if <条件>:
            temp.append(x+i)
list3= for slogan in list1 for name in list2 if slogan == name]
所以你的这题可以分解成这样:
list3=[]
for slogan in list1:
      for name in list2:
                if slogan==name:
                        list3.append(name + ':'+ slogan)

txxcat 发表于 2020-6-18 14:48:09

看样子你对答案的列表推导式并没有理解,slogan是遍历list1中的元素,name1是遍历list2的元素,slogan和name是列表中每个元素的第一个字符,所以你要象下面演示的那样才能得到正确答案:
>>> list1=['1.Just do It','2.一切皆有可能','3.让编程改变世界','4.Impossible is Nothin']
>>> list2=['4.阿迪达斯','2.李宁','3.鱼C工作室','1.耐克']
>>> list1
'1.Just do It'
>>> list2
'1.耐克'
>>> list1 == list2
True

shmily1866 发表于 2020-6-18 14:55:28

Twilight6 发表于 2020-6-18 12:29
说比较 ASCII 值也没错呀没错 ,你比首个字母是否相等本质 不是照样是 比较 ASCII 码值? 而 == 这个 ...

列表推导我会,自己也分解写出来了,得出的结果也对。
按代码的意思是当slogan == name 时执行append的操作。
也就是1.nike == 1.just do it
那么当我在idle里单独尝试 list1==list2 的时候却返回false,这是为什么啊

Twilight6 发表于 2020-6-18 14:56:17

shmily1866 发表于 2020-6-18 14:55
列表推导我会,自己也分解写出来了,得出的结果也对。
按代码的意思是当slogan == name 时执行a ...

字符不相等 就返回 False 了

你可以发下你的代码 帮你看看 这样更好解释

shmily1866 发表于 2020-6-18 15:09:23

wp231957 发表于 2020-6-18 12:05
第二,它俩是俩字符串的比较,要求完全一致,才是true

但是答案里对字符串进行了比较,直接执行答案的代码结果也是正确的啊。我自己比较却返回flase

shmily1866 发表于 2020-6-18 15:28:15

Twilight6 发表于 2020-6-18 14:56
字符不相等 就返回 False 了

你可以发下你的代码 帮你看看 这样更好解释

list1 =['1.just','2.yiqie','3.biancheng','4.nothing']
list2 =['4.adi','2.lining','3.鱼c','1.nike']
list3 = []
for slogan in list1:
        for name in list2:
                if slogan == name:
                        list3.append(name+':'+slogan)
print (list3)


执行后结果没毛病
['1.nike:just', '2.lining:yiqie', '3.鱼c:biancheng', '4.adi:nothing']

然后我试着在idle里尝试一些字符串的比较

>>> list1 =['1.just','2.yiqie','3.biancheng','4.nothing'];list2 =['4.adi','2.lining','3.鱼c','1.nike']
>>> list1>list2
False
>>> list1<list2
True
>>> list1 == list2
False

list1(也就是'1.just')是小于list(也就是'1.nike') 的,他俩不等于

就很奇怪。为啥if slogan == name可以得到true的结果,我自己在idle里却不行呢。

我也尝试了列表里只有一个元素的情况,
>>> n=['1.just'];n1=['1.nike']
>>> n==n1
False
>>> n<n1
True

就他娘的邪了门了。。。。我用的是3.8.2版本

Twilight6 发表于 2020-6-18 15:37:50

shmily1866 发表于 2020-6-18 15:28
list1 =['1.just','2.yiqie','3.biancheng','4.nothing']
list2 =['4.adi','2.lining','3.鱼c','1.nike' ...

list1 =['1.just','2.yiqie','3.biancheng','4.nothing']
list2 =['4.adi','2.lining','3.鱼c','1.nike']

则你 :
list1 = '1.just'
list2 = '1.nike'
相当于比较   '1.just' > '1.nike'
字符串逐个比较是比较ASCII码值的,只要有一个比较出大小就不在后续进行比较
这里先比较

'1' 和 '1'发现相等 继续比较下一个字符
'.' 和 '.' 发现还是相等 继续比较下一个字符

'j' 和 'n' 比较大小, 而 j 的ASCII码值是 106   n 的ASCII码值是 110 所以j < n

所以 list1 < list2   而你判断是list1>list2 当然返回 False

yhhpf 发表于 2020-6-18 15:39:24

shmily1866 发表于 2020-6-18 15:09
但是答案里对字符串进行了比较,直接执行答案的代码结果也是正确的啊。我自己比较却返回flase

>>> list3 = for slogan in list1 for name in list2 if slogan == name]
以上答案里的slogan,name 是取的list1、2里的元素,slogan == name是将两个元素内第1个字符做比较。

而你说的list1 == list2是将两个列表的两个元素做比较,返回的当然是False

shmily1866 发表于 2020-6-18 15:41:35

txxcat 发表于 2020-6-18 14:48
看样子你对答案的列表推导式并没有理解,slogan是遍历list1中的元素,name1是遍历list2的元素,slogan和 ...

那为啥答案里的if slogan == name可以得到true的结果啊。

我还尝试了列表里只有一个元素的情况

>>> n=['1.just'];n1=['1.nike']
>>> n==n1
False
结果还是不相等

shmily1866 发表于 2020-6-18 15:46:50

Twilight6 发表于 2020-6-18 15:37
则你 :
list1 = '1.just'
list2 = '1.nike'


那为啥答案里的if slogan == name可以得到true的结果啊。

我还尝试了列表里只有一个元素的情况

>>> n=['1.just'];n1=['1.nike']
>>> n==n1
False
结果还是不相等

shmily1866 发表于 2020-6-18 15:47:34

yhhpf 发表于 2020-6-18 15:39
>>> list3 = for slogan in list1 for name in list2 if slogan == name ...

那为啥答案里的if slogan == name可以得到true的结果啊。

我还尝试了列表里只有一个元素的情况

>>> n=['1.just'];n1=['1.nike']
>>> n==n1
False
结果还是不相等

Twilight6 发表于 2020-6-18 15:48:48

shmily1866 发表于 2020-6-18 15:46
那为啥答案里的if slogan == name可以得到true的结果啊。

我还尝试了列表里只有一个元素的 ...

醉了呀 你
n=['1.just']
n1=['1.nike']
nn1 是指 列表里面的 第一个元素 ,是整个字符串 '1.just' 、'1.nike'

而甲鱼哥的 是'1.just' 、'1.nike' 字符串的第一个元素 '1' 、 '1'

shmily1866 发表于 2020-6-18 15:59:00

Twilight6 发表于 2020-6-18 15:48
醉了呀 你
n=['1.just']
n1=['1.nike']


for命令遍历的是列表里每个元素的每个字符???

Twilight6 发表于 2020-6-18 16:02:21

shmily1866 发表于 2020-6-18 15:59
for命令遍历的是列表里每个元素的每个字符???

for 循环遍历列表里的字符串元素

temp = ['111','222','333']
for i in temp:
    print(i)
>>>111
>>>222
>>>333
for i in temp:
    print(i)

>>>1
>>>2
>>>3

shmily1866 发表于 2020-6-18 16:05:31

shmily1866 发表于 2020-6-18 15:59
for命令遍历的是列表里每个元素的每个字符???

那为啥答案里的if slogan == name可以得到true的结果啊。

for 命令是遍历 里每个元素的每个字符么?

n1==n确实相等
但是答案里他就写了一个啊,而且执行起来也没问题

shmily1866 发表于 2020-6-18 16:23:11

Twilight6 发表于 2020-6-18 16:02
for 循环遍历列表里的字符串元素

明白了,万分感谢!!!!!!!

shmily1866 发表于 2020-6-18 16:24:14

Twilight6 发表于 2020-6-18 16:02
for 循环遍历列表里的字符串元素

for i in temp:
    print(i)
>>>111
>>>222
>>>333

也就是 i 此时就是个普通变量不是一个列表对吧
页: [1] 2
查看完整版本: 请教一个列表里字符串比较的问题