鱼C论坛

 找回密码
 立即注册
查看: 2503|回复: 6

[已解决]列表元素abc加入元组后变a,b,c

[复制链接]
发表于 2022-10-5 00:53:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
name = input().split()
newname = ()
i = 0
while i < 1:
    try:
        newname += tuple(name[i])
        i += 1
    except:
        break
print(newname)
abc
('a', 'b', 'c')

心中预期输出 ('abc')
最佳答案
2022-10-5 07:59:35


因为你输入的字符串为  abc,通过 split 函数切割后,返回的结果为 ["abc"]

但,你对一个字符串调用 tuple 转换为元组,返回的结果是将每个元素都作为元组的一单独的元素

即 tuple(name[ i ]) = tuple("abc") = ("a", "b", "c"),所以当 newname + ("a", "b", "c") 时, newname 初始化为 () 空元组,返回的结果自然也是("a", "b", "c")

而且对元组使用 + 号,是两个元组连接,即 (xxx, yyy) + (zzz, www) 结果为 (xxx, yyy, zzz, www)

所以就算你你这里循环是 ("a",) 、("b",)、("c",) 这样单个元素,也依旧是将每个字符串中的字符,进行元组的 + 连接操作,最终结果依然为 ("a", "b", "c")

所有如果你想实现你预计的结果,那么可以将列表直接转换为元组就没问题,即 tuple(name[ i ]) 改成 tuple(name)

参考代码:
name = input().split()
newname = ()
i = 0
while i < 1:
    try:
        newname += tuple(name)
        i += 1
    except:
        break
print(newname)

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-5 07:25:04 | 显示全部楼层
之所以最后的结果是('a', 'b', 'c')而不是('abc'),关键在第6行。

当我们一开始输入abc之后,由于它们之间没有空格,所以split方法没法把它们分开,也就是说name是['abc']。
到了第6行,name[i]就是访问name索引为0的元素,也就是'abc',然后把这个字符串传给tuple。这里就是发生变化的地方了。tuple检测到传入的值是一个字符串,就会把字符串中的每一个字符都拆开然后组成一个元组。这个新的元组和newname合并,如此一来你看到的结果就是('a', 'b', 'c')了。

主要原因是,如果传给tuple的值是可以迭代的(例如列表、元组、字典、字符串、集合等内置数据类型以及自己定义的可迭代类型),那么tuple会自动逐个读取其中的元素然后把这些元素组合成一个新的元组。这种情况对list、set、dict都适用。

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
jcpython2 + 1 + 1 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-5 07:59:35 | 显示全部楼层    本楼为最佳答案   


因为你输入的字符串为  abc,通过 split 函数切割后,返回的结果为 ["abc"]

但,你对一个字符串调用 tuple 转换为元组,返回的结果是将每个元素都作为元组的一单独的元素

即 tuple(name[ i ]) = tuple("abc") = ("a", "b", "c"),所以当 newname + ("a", "b", "c") 时, newname 初始化为 () 空元组,返回的结果自然也是("a", "b", "c")

而且对元组使用 + 号,是两个元组连接,即 (xxx, yyy) + (zzz, www) 结果为 (xxx, yyy, zzz, www)

所以就算你你这里循环是 ("a",) 、("b",)、("c",) 这样单个元素,也依旧是将每个字符串中的字符,进行元组的 + 连接操作,最终结果依然为 ("a", "b", "c")

所有如果你想实现你预计的结果,那么可以将列表直接转换为元组就没问题,即 tuple(name[ i ]) 改成 tuple(name)

参考代码:
name = input().split()
newname = ()
i = 0
while i < 1:
    try:
        newname += tuple(name)
        i += 1
    except:
        break
print(newname)

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-5 09:38:38 | 显示全部楼层
本帖最后由 jackz007 于 2022-10-5 09:48 编辑

          只要试试:
print(tuple('abc'))
          你就知道原因了
          预期输出
('abc')
          根本不可能,因为单元素的元组应该是这样:
('abc',)
          但是,['abc'] 是可以的,tuple(['abc']) 就是 ('abc',)
          如果能接受,下面就是代码:
print(tuple([input() . split()[0]]))

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
jcpython2 + 1 + 1 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-5 11:25:48 | 显示全部楼层
本帖最后由 jcpython2 于 2022-10-5 12:31 编辑
Twilight6 发表于 2022-10-5 07:59
因为你输入的字符串为  abc,通过 split 函数切割后,返回的结果为 ["abc"]

但,你对一个字符串调用 ...


OK看了三个答案发现了 直接传递字符串进元组会自动分拆
那么

我的题目要求指定组合元组某个位置的元素,不能使用指针那样 tuple(0:1),有没有办法指定组合?  类似于
newname += tuple(name[i])
这段错误代码一样



以下是我的解法,但感觉繁琐冗余
name = input().split()
c = []
for i in range(3):
    c.append(name[i])
c = tuple(c)
print(c)

取了list的前三转为tuple

试着简化了一下,又出错
c = tuple(c.append(name[i]) for i in range(3))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-5 11:28:04 | 显示全部楼层
jackz007 发表于 2022-10-5 09:38
只要试试:

          你就知道原因了

主要不知道直接传递字符串进元组会被分拆,平时习惯用split给 input转list
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-5 11:39:36 | 显示全部楼层
Twilight6 发表于 2022-10-5 07:59
因为你输入的字符串为  abc,通过 split 函数切割后,返回的结果为 ["abc"]

但,你对一个字符串调用 ...

再看你的答案,我发现了我另一个错误,我试图把tuple的指定元素合并到另一个tuple里面去,但是一旦指定了tuple里面的元素,单独抽出来,他就不一定是tuple,所以我以为tuple[i] 也是tuple,实际上抽出来已经可能是str
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-14 23:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表