对 Python 不熟,问个问题

2022-01-10 19:52:24 +08:00
 liuzhen
python 里如何用优雅的方式完成以下需求呢?
两个表或者两个数组
表 A 有 id(从 1 自增),name 列
表 B 有 name 列

表 B 有数据:
zhangsan
lisi
wanger
mazi

需求是把表 A 里 id 为 4 的 name 列填充为 zhangsan ,为 8 的 name 列为 lisi ,16 的 name 列为 wanger ..以此类推

for 循环的方式我能实现,想找到更简洁优雅的方式
3613 次点击
所在节点    Python
11 条回复
hutoer
2022-01-10 20:07:22 +08:00
我觉得 SQL 就行,给表 B 增加 id(从 1 自增)
然后就是类似:update A.name = B.name from A,B where A.id = POWER(2, B.id + 1)
ADMlN
2022-01-10 23:54:40 +08:00
比如:
A={i:'' for i in range(1,41)}
B=['zhangsan','lisi','wanger','mazi']
A.update({2**(i+2):b for i,b in enumerate(B)})
hackpro
2022-01-11 00:13:49 +08:00
挺有意思的问题
AX5N
2022-01-11 01:32:52 +08:00
如果用你熟悉的语言,你会怎么优雅地实现?
soo2
2022-01-11 02:33:59 +08:00
(看到 Wanger 笑了。)
rpman
2022-01-11 02:44:37 +08:00
港真循环挺好的
嫌弃的话可以用 map
seers
2022-01-11 08:03:00 +08:00
迭代器
raptor
2022-01-11 10:41:34 +08:00
不怕麻烦的话,pandas 了解一下?

A 和 B 转为 pandas.DataFrame

B['id'] = [2 ** (id + 1) for id in A['id']]
A.set_index(["id"], inplace=True)
A.update(B.set_index(['id']))
A.reset_index(inplace=True)
imn1
2022-01-11 12:17:40 +08:00
我简单理解你的描述,A 的 id/name 两列都可以重复的(不重复也没必要循环了),B 是各自独立不重复的

其实这个取决于 A 的格式
二维 list --> 循环 /map/lambda ,list 也没办法优雅,即使用 map 也是要执行写入时循环一遍
pandas --> mask()
sql --> sql 命令

B 可以用
1.enum ,如果 B 为整数递增就 IntEnum ,如果 B 为二进制整数递增就 IntFlag
2.以数值做 key 的字典
3.pandas.Series 或 numpy
4.以位置作为索引的列表,无值的位置填入 None
当然 1 是最简单,因为 enum 可以用 key 读取 value ,也可以用 value 读取 key ,字典只能从 key 读取 value ,所以只能用数值作为 key
如果 A 是 sql ,B 可以继承 enum 并自定义一个__conform__(self, protocol)方法,方便读取|写入数据库
Telegram
2022-01-11 13:18:13 +08:00
临时用一次的就别考虑优雅了,能实现就行,浪费时间。
如果以后经常要用到,那倒是可以花点时间优化下方案。
liuxingdeyu
2022-01-11 13:38:59 +08:00
优雅除了更高逼格的写法,还要尽量不牺牲代码的可阅读性

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/827411

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX