【问题标题】:Convert every line in the string into dictionary key将字符串中的每一行转换为字典键
【发布时间】:2021-04-28 10:33:32
【问题描述】:

你好,我是 python 新手,不知道我是否可以在这个网站上问这个基本问题

我想把字符串中的每一行都转换成一个key,然后赋值为0

我的字符串是:

s = '''
sarika

santha

#

akash


nice
'''

我曾尝试过这种https://www.geeksforgeeks.org/ways-to-convert-string-to-dictionary/ 方式,但认为对我的要求没有用

请帮助任何人提前谢谢

编辑:

实际上我要求的是基本字符串,但实际上我要求的是跟随字符串

s="""
san
francisco

Santha

Kumari



this one
"""

 Here it should take {sanfrancisco:0 , santha kumari:0 , this one: 0 }

这是我面临的挑战

在我的字符串中,如果有超过 1 个换行符,它应该将下一行字符串作为一个单词并转换为键

【问题讨论】:

  • 期望的行为不清楚:为什么Santha\n\nKumari 解析为一个键? (我还想指出,一旦你有了你的字符串列表,获得所需的字典就很容易理解了,但我想说这里有一个 X-Y 问题,你实际上并不需要那个字典.)

标签: python string dictionary


【解决方案1】:

您可以通过以下方式进行:

>>> s="""
... hello
... #
... world
... 
... vk
... """
>>> words = s.split("\n")
>>> words
['', 'hello', '#', 'world', '', 'vk', '']
>>> words = words[1:len(words)-1]
>>> words
['hello', '#', 'world', '', 'vk']
>>> word_dic = {}
>>> for word in words:
...     if word not in word_dic:
...             word_dic[word]=0
... 
>>> word_dic
{'': 0, 'world': 0, '#': 0, 'vk': 0, 'hello': 0}
>>> 

如果您有任何问题,请告诉我。

【讨论】:

  • 但我不想在我的 dict 中得到空格和特殊字符,你能帮帮我吗
  • 嗨,你可以看看我的回答,我认为它解决了你所有的问题;)。
【解决方案2】:

您可以连续匹配所有行后跟 2 个换行符,或匹配所有行后跟一个换行符。

^(?:\S.*(?:\n\n\S.*)+|\S.*(?:\n\S.*)*)

模式匹配

  • ^ 字符串开始
  • (?:非捕获组
    • \S.* 匹配一个非空白字符和该行的其余部分
    • (?:\n\n\S.*)+ 重复匹配 1+ 次 2 个换行符、一个非空白字符和该行的其余部分
    • |或者
    • \S.* 匹配单个非空白字符和该行的其余部分
    • (?:\n\S.*)* 可选匹配换行符、非空白字符和行的其余部分
  • )关闭非捕获组

Regex demo | Python demo

对于这些匹配项,用空格替换 2 个换行符,用空字符串替换一个换行符。

然后根据这些值,创建一个字典并用 0 初始化所有值。

例子

import re

s="""
san
francisco

Santha

Kumari



this one
"""
pattern = r"^(?:\S.*(?:\n\n\S.*)+|\S.*(?:\n\S.*)*)"
my_dict = dict.fromkeys(
    [
        re.sub(
            r"(\n\n)|\n",
               lambda n: " " if n.group(1) else "", s.lower()
        ) for s in re.findall(pattern, s, re.MULTILINE)
    ],
    0
)
print(my_dict)

输出

{'sanfrancisco': 0, 'santha kumari': 0, 'this one': 0}

【讨论】:

    【解决方案3】:

    你可以这样做:

    # Split the string into a list
    l = s.split()
    dictionary = {}
    
    # iterate through every element of the list and assign a value of 0 to it
    
    n = 0
    
    
    for word in l:
       while n < len(l) - 1:
           if word == "#":
               continue
           w = l[n] + l[n+1]
           dictionary.__setitem__(w, 0)
           n+=2
    print(dictionary)
    

    【讨论】:

    • 我已经编辑了我的问题,并解释了我在使用您的代码时面临的挑战,请您帮助我
    • @GetTwoBirdsStonedAtOnce 你能帮帮我吗
    • @coder 我已经编辑了我的答案,这行得通吗?
    • @GetTwoBirdsStonedAtOnce 你能解释一下 for 循环一次吗
    • 当然,所以:for循环将获取列表中的每个项目并对其进行处理,然后我希望它运行只要“n” - 迭代器计数小于长度列表中的 - 1,(-1,因为有一个剩余点会导致整个事情中断),然后我将接下来的两个单词加在一起并将该单词分配为值为 0 的键,然后我递增迭代器计数为 2,因为当我只将其增加 1 时遇到了奇怪的问题,然后输出是:{'sanfrancisco': 0, 'franciscoSantha': 0, 'SanthaKumari': 0, 'Kumarithis': 0, 'thisone' : 0}。
    【解决方案4】:

    步骤-

    1. 通过翻译从字符串中删除标点符号。
    2. 如果单词被 2 个 \n 字符分隔,则拆分单词
    3. 从列表中删除空格
    4. 删除 \n 字符并使用字典理解生成所需的字典
    import string
    s = '''
    sarika
    santha
    
    #
    
    akash
    
    
    
    
    nice
    '''
    
    s = s.translate(str.maketrans('', '', string.punctuation))
    word_list = s.split('\n\n')
    while '' in word_list:
        word_list.remove('')
    result = {word.replace('\n', ''): 0 for word in word_list}
    print(result)
    
    

    【讨论】:

      猜你喜欢
      • 2015-12-25
      • 2017-02-11
      • 2014-02-07
      • 2015-09-16
      • 2014-06-29
      • 1970-01-01
      • 2021-07-25
      相关资源
      最近更新 更多