首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python中使用嵌套for循环的列表匹配

Python中使用嵌套for循环的列表匹配
EN

Stack Overflow用户
提问于 2016-01-21 05:58:03
回答 1查看 259关注 0票数 0

我有三个列表,(1)治疗(2)药物名称和(3)药物代码符号。我正在尝试为14,700种治疗中的每一种识别各自的医药代码符号。我目前的方法是识别(2)中是否有任何名称是" in“(1),然后返回相应的(3)。然而,我得到了一个与14,700种治疗相对应的药品代码符号的随机列表(正确长度)。我所写的方法代码如下:

代码语言:javascript
运行
复制
codes = pandas.read_csv('Codes.csv', dtype=str)
codes_list = _codes.values.tolist()

names = pandas.read_csv('Names.csv', dtype=str)
names_list = names.values.tolist()

treatments = pandas.read_csv('Treatments.csv', dtype=str)
treatments_list = treatments.values.tolist()   

matched_codes_list = range(len(treatments_list))
for i in range(len(treatments_list)):
    for j in range(len(names_list)):
        if names_list[j] in treatments_list[i]:
            matched_codes_list[i]=codes_list_text[j]
print matched_codes_list

如果你对我的错误之处有任何建议,将不胜感激!

EN

回答 1

Stack Overflow用户

发布于 2016-01-21 06:53:20

我不知道你在期待什么。您应该将xxx_list代码替换为示例,因为您在读取csv时似乎没有任何问题。

假设你这样做了,你的结果是这样的。

代码语言:javascript
运行
复制
codes_list = ['shark', 'panda', 'horse']
names_list = ['fin', 'paw', 'hoof']
assert len(codes_list) == len(names_list)
treatments_list = ['tape up fin', 'reverse paw', 'stand on one hoof', 'pawn affinity maneuver', 'alert wing patrol']

这听起来像是你在尝试确定每个“治疗”的“代码”,假设代码和名称的数量是相同的(并表示一些映射)。您计划使用名称的存在来确定代码。

我们可以将名称和代码列表压缩在一起,以避免在那里使用索引,并且我们可以在处理列表上使用迭代,而不是使用索引,以提高pythonic的可读性

代码语言:javascript
运行
复制
matched_codes_list = []
for treatment in treatment:
    matched_codes = []
    for name, code in zip(names_list, codes_list):
        if name in treatment:
            matched_codes.append(code)
    matched_codes_list.append(matched_codes)

这会给出类似这样的结果

代码语言:javascript
运行
复制
assert matched_codes_list == [
  ['shark'],                    # 'tape up fin'
  ['panda'],                    # 'reverse paw'
  ['horse'],                    # 'stand on one hoof'
  ['shark', 'panda', 'horse'],  # 'pawn affinity maneuver'
  [],                           # 'alert wing patrol'
]

请注意,用于执行此操作的方法相当慢(并且可能会给出误报,请参阅第四个条目)。您将为每个名称/代码对遍历一次所有治疗描述的文本。

你可以使用像'lookup = {name: code for name,code in zip(names_list,codes_list)},或者itertools.izip这样的字典来获得更小的好处,否则可能需要更聪明的方法,比如将处理方法分成一个包含单词的集合,或者将单词映射到多个代码中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34911418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档