Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用字符串拆分的列表理解_Python_Python 3.x - Fatal编程技术网

Python 使用字符串拆分的列表理解

Python 使用字符串拆分的列表理解,python,python-3.x,Python,Python 3.x,以下代码接受两个输入,商品名称和销售类型。它将查看item_dict,以查找是否有任何键包含item_name的一部分或与之完全匹配,并输出值 我正在尝试将以下for循环转换为列表理解。我对基本列表的理解相当满意,但在这种情况下,我要求拆分文本并获得相关结果。我不确定我所要求的是否可能 item_name = "GalaxyDevices" sale_type = "buy" item_dict = {"buy_Galaxy": [11

以下代码接受两个输入,
商品名称
销售类型
。它将查看
item_dict
,以查找是否有任何键包含
item_name
的一部分或与之完全匹配,并输出值

我正在尝试将以下
for循环
转换为列表理解。我对基本列表的理解相当满意,但在这种情况下,我要求拆分文本并获得相关结果。我不确定我所要求的是否可能

item_name = "GalaxyDevices"
sale_type = "buy"
item_dict = {"buy_Galaxy": [11111, 2232], "sell_Galaxy": [2111]}
results = []

for key, value in item_dict.items():
    key = key.split("_")

    if key[0] != sale_type:
        continue

    if key[1] in item_name:
        results.extend(value)

print(results)

输入/输出:

item_name = "GalaxyDevices"
sale_type = "buy"
>>> [11111, 2232]
我失败的尝试:

results = [value.split("_") for key, value in item_dict.items()]

非常感谢

使用嵌套列表理解和
设置
来确定是否有交集

然而,这需要3条规则:

  • 名称有某种分隔符-CamelCase分隔需要
    re
  • 每个名称的一部分不应与
    dict
    中的任何名称匹配。i、 e.
    Hello\u world
    同时匹配
    Hello\u buy
    world\u buy
    ,以获得最佳效果
对于一个班轮:

name=input(“name>>”)
类型=输入(“交易类型>>”)
结果=[item_dict[key]for key in[key_uufor key_uuin item_dict.keys()如果type_uin key_uu]如果设置(name.split())&设置(key.split(“u”)]

解释 以上等于:

intersecting_words = lambda name_, keys_: set(name) & set(keys_)

key_matching_part = [key for key in item_dict.keys() if intersecting_words(name, key.split("_"))]

results = [item_dict[key] for key in key_matching_part]

全面测试:

item_dict = {"Guido_buy": 100, "Guido_sell": -100,
             "Ramalho_buy": 200, "Ramalho_sell": -200}


name = "Guido van Rossum"
type_ = "buy"

results = [item_dict[key] for key in [key_ for key_ in item_dict.keys() if type_ in key_] if set(name.split()) & set(key.split("_"))]
print(results)


name = "Luciano Ramalho"
type_ = "sell"

results = [item_dict[key] for key in [key_ for key_ in item_dict.keys() if type_ in key_] if set(name.split()) & set(key.split("_"))]
print(results)
输出:

[100]
[-200]

使用嵌套列表理解和
set
来确定是否有交叉点

然而,这需要3条规则:

  • 名称有某种分隔符-CamelCase分隔需要
    re
  • 每个名称的一部分不应与
    dict
    中的任何名称匹配。i、 e.
    Hello\u world
    同时匹配
    Hello\u buy
    world\u buy
    ,以获得最佳效果
对于一个班轮:

name=input(“name>>”)
类型=输入(“交易类型>>”)
结果=[item_dict[key]for key in[key_uufor key_uuin item_dict.keys()如果type_uin key_uu]如果设置(name.split())&设置(key.split(“u”)]

解释 以上等于:

intersecting_words = lambda name_, keys_: set(name) & set(keys_)

key_matching_part = [key for key in item_dict.keys() if intersecting_words(name, key.split("_"))]

results = [item_dict[key] for key in key_matching_part]

全面测试:

item_dict = {"Guido_buy": 100, "Guido_sell": -100,
             "Ramalho_buy": 200, "Ramalho_sell": -200}


name = "Guido van Rossum"
type_ = "buy"

results = [item_dict[key] for key in [key_ for key_ in item_dict.keys() if type_ in key_] if set(name.split()) & set(key.split("_"))]
print(results)


name = "Luciano Ramalho"
type_ = "sell"

results = [item_dict[key] for key in [key_ for key_ in item_dict.keys() if type_ in key_] if set(name.split()) & set(key.split("_"))]
print(results)
输出:

[100]
[-200]

我认为这应该奏效:

results = [
    value
    for key, values in item_dict.items()
    if (key.split('_')[0] == sale_type
        and key.split('_')[1] in item_name)
    for value in values
]

我认为这应该奏效:

results = [
    value
    for key, values in item_dict.items()
    if (key.split('_')[0] == sale_type
        and key.split('_')[1] in item_name)
    for value in values
]


那太复杂了!这就是OP要求的,不是吗?OP明确提到他/她希望获得2个输入-名称和交易类型。这是最简单但最短的答案。我喜欢这里的答案,但它只是缺少了项目名称,它可以像我的“galaxydevices”示例中的包含匹配一样,字典中有“buy\u galaxy”,可以找到它。如果我只输入完整的项目名称,这就行了。是的,我已经从您的描述中了解到,您也需要处理
项目名称
。仅从提供的代码中可以看出。我认为您需要使用一些分隔符来分隔
项目名称
,而无需借助
re
。不能使用
listcomp
,但可以使用函数。如果可能的话,我会相应地更新那个案例的答案。那个太复杂了!这就是OP要求的,不是吗?OP明确提到他/她希望获得2个输入-名称和交易类型。这是最简单但最短的答案。我喜欢这里的答案,但它只是缺少了项目名称,它可以像我的“galaxydevices”示例中的包含匹配一样,字典中有“buy\u galaxy”,可以找到它。如果我只输入完整的项目名称,这就行了。是的,我已经从您的描述中了解到,您也需要处理
项目名称
。仅从提供的代码中可以看出。我认为您需要使用一些分隔符来分隔
项目名称
,而无需借助
re
。不能使用
listcomp
,但可以使用函数。如果可能的话,我会相应地更新答案。这很简单,但我不明白为什么最后一行需要值?否则你会得到一个列表列表作为回报。我很喜欢这个解决方案,但最后一部分是在玩弄我的大脑。最后一个for值是否属于if语句?或者它是使用第一个for循环作为嵌套吗?不完全是这样:它只在满足
条件时执行
。编辑:对不起,我还没有读到你的第二个问题:它使用第一个
作为嵌套,但只有在满足
条件时才使用
。注意,你有什么参考资料可以让我了解更多吗?这很好,但我不明白为什么最后一行需要值?否则你会得到一个列表作为回报。我很喜欢这个解决方案,但最后一部分是在玩弄我的大脑。最后一个for值是否属于if语句?或者它是使用第一个for循环作为嵌套吗?不完全是这样:它只在满足
条件时执行
。编辑:对不起,我还没有读到你的第二个问题:它正在使用第一个
作为嵌套,但只有在满足
条件时才使用。注意,你有任何参考资料,我可以从中了解更多信息吗?