V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
liuzhen
V2EX  ›  Python

对 Python 不熟,问个问题

  •  
  •   liuzhen ·
    liuzhen9327 · 2022-01-10 19:52:24 +08:00 · 3645 次点击
    这是一个创建于 1082 天前的主题,其中的信息可能已经有所发展或是发生改变。
    python 里如何用优雅的方式完成以下需求呢?
    两个表或者两个数组
    表 A 有 id(从 1 自增),name 列
    表 B 有 name 列

    表 B 有数据:
    zhangsan
    lisi
    wanger
    mazi

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

    for 循环的方式我能实现,想找到更简洁优雅的方式
    11 条回复    2022-01-11 13:38:59 +08:00
    hutoer
        1
    hutoer  
       2022-01-10 20:07:22 +08:00   ❤️ 2
    我觉得 SQL 就行,给表 B 增加 id(从 1 自增)
    然后就是类似:update A.name = B.name from A,B where A.id = POWER(2, B.id + 1)
    ADMlN
        2
    ADMlN  
       2022-01-10 23:54:40 +08:00   ❤️ 1
    比如:
    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
        3
    hackpro  
       2022-01-11 00:13:49 +08:00 via iPhone
    挺有意思的问题
    AX5N
        4
    AX5N  
       2022-01-11 01:32:52 +08:00
    如果用你熟悉的语言,你会怎么优雅地实现?
    soo2
        5
    soo2  
       2022-01-11 02:33:59 +08:00 via iPhone   ❤️ 1
    (看到 Wanger 笑了。)
    rpman
        6
    rpman  
       2022-01-11 02:44:37 +08:00
    港真循环挺好的
    嫌弃的话可以用 map
    seers
        7
    seers  
       2022-01-11 08:03:00 +08:00 via Android
    迭代器
    raptor
        8
    raptor  
       2022-01-11 10:41:34 +08:00   ❤️ 2
    不怕麻烦的话,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
        9
    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
        10
    Telegram  
       2022-01-11 13:18:13 +08:00
    临时用一次的就别考虑优雅了,能实现就行,浪费时间。
    如果以后经常要用到,那倒是可以花点时间优化下方案。
    liuxingdeyu
        11
    liuxingdeyu  
       2022-01-11 13:38:59 +08:00
    优雅除了更高逼格的写法,还要尽量不牺牲代码的可阅读性
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2572 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 11:14 · PVG 19:14 · LAX 03:14 · JFK 06:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.