鱼C论坛

 找回密码
 立即注册
查看: 1926|回复: 11

[已解决]随机将一字符串/列表的元素移到另一对象中后

[复制链接]
发表于 2022-6-15 16:38:10 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 12345ab 于 2022-6-16 17:20 编辑

例子:

a,b= 'abc','123'
move(a,b)
print(a,b)

输出可以是:  ab 123c
(a的随机一个字元移到b尾部)

例子2:
a,b= ['apple,'banana','car'],['dog','egg','fun']
move(a.b)
print(a,b)

输出可以是:
['banana','car'] ['dog','egg','fun','apple']
(a的一个元素移到b列表尾部)

我写的代码:(并不能达到标题的要求)
import random
def move(a,b)
        rand = int(random.random()*len(a))
        b += a[rand]   
        del a[rand]

但是我发现(以例子2为例)当a和b的类型是列表时 .
a[rand]的类型是并不是列表,
于是导致了 b += a[rand]最后的结果是
['dog','egg','fun','a','p','p','l','e']

我也曾想过使用pop()方法但这一方法却又不兼容str类型
难道就没有一个能同时兼容字符串和列表的方法么
最佳答案
2022-6-16 17:26:26
12345ab 发表于 2022-6-16 17:18
感谢指正 我当时忽略了元组字典这些类型了
准确来说只需要兼容列表和字符串就行了

用type探测类型,然后建立两个分支
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-6-15 16:38:56 | 显示全部楼层
希望我有将我的意思表达清楚
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-15 17:10:13 From FishC Mobile | 显示全部楼层
你确定你的函数能实现例子1的结果?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-15 17:16:21 From FishC Mobile | 显示全部楼层
  1. import random

  2. def move(a, b):
  3.     b.append(a.pop(random.randint(0,len(a)-1)))

  4. # 仅限 ab 都是列表
  5. a,b= ['apple', 'banana','car'],['dog','egg','fun']
  6. move(a, b)
  7. print(a,b)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-15 17:17:51 From FishC Mobile | 显示全部楼层
hrpzcf 发表于 2022-6-15 17:16

它的意思是用一个函数可以实现任意类型的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-15 17:50:02 From FishC Mobile | 显示全部楼层
wp231957 发表于 2022-6-15 17:17
它的意思是用一个函数可以实现任意类型的


那只能给函数加返回值了,要是a, b类型不同的的话那就更复杂了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-15 22:50:32 | 显示全部楼层
不符合逻辑,比如 tuple 类型是不可改类型(只能换新对象)但都是可迭代。

Python 虽然很多很简化操作方法,但由于太简化,导致一些代码想自行更改其构造或者自定义构造反而变得非常困难。C++ 的重载或 C 的空指针完美解决这种问题。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-16 17:18:01 | 显示全部楼层
傻眼貓咪 发表于 2022-6-15 22:50
不符合逻辑,比如 tuple 类型是不可改类型(只能换新对象)但都是可迭代。

Python 虽然很多很简化操作方 ...


感谢指正 我当时忽略了元组字典这些类型了
准确来说只需要兼容列表和字符串就行了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-16 17:26:26 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
12345ab 发表于 2022-6-16 17:18
感谢指正 我当时忽略了元组字典这些类型了
准确来说只需要兼容列表和字符串就行了

用type探测类型,然后建立两个分支
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-16 17:30:03 | 显示全部楼层
wp231957 发表于 2022-6-16 17:26
用type探测类型,然后建立两个分支

好主意
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-16 17:37:41 | 显示全部楼层
12345ab 发表于 2022-6-16 17:18
感谢指正 我当时忽略了元组字典这些类型了
准确来说只需要兼容列表和字符串就行了

  1. from random import randint

  2. def foo(A, B):
  3.     n = randint(0, len(A) - 1)
  4.     if type(A) == str:
  5.         X = ''.join([c for i, c in enumerate(A) if i != n])
  6.         Y = B + A[n]
  7.         return X, Y
  8.     B += [A[n]]
  9.     A.pop(n)
  10.     return A, B

  11. a = "banana"
  12. b = "flower"
  13. a, b = foo(a, b)
  14. print(a, b)

  15. # -------------------

  16. c = ['a', 'b', 'c']
  17. d = [1, 2, 3, 4, 5]
  18. c, d = foo(c, d)
  19. print(c, d)
复制代码
  1. banna flowera
  2. ['b', 'c'] [1, 2, 3, 4, 5, 'a']
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-6-16 18:02:06 | 显示全部楼层

十分感谢
你这比我写的那段简洁多了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-22 20:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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