【问题标题】:How to filter string out from a list inside a list and append to a new list如何从列表中的列表中过滤出字符串并附加到新列表
【发布时间】:2021-06-14 02:28:46
【问题描述】:

我正在尝试从列表中的列表中过滤出数据,但没有得到预期的输出。

我的清单:

lnks = [['adsd%linkedin.comhasdhu', 'sahasbfacebook.comdcs', 'dfsdftwitter.comdsddf'],
['vsdd%linkedin.comfsadfs', 'sdfsdfsfacebook.comsfsdf', '345r3ftwitter.comwer'],
['fvsdlinkedin.comsdfsf', 'sdfefacebook.comswwert', 'wtwtwitter.comy4w4y']]

我的代码:

linkedin = []
twitter = []
facebook = []

for lnk in lnks:
    if "linkedin" in lnk:
        try:
            linkedin.append(lnk)
        except:
            linkedin.append("")
    elif "twitter" in lnk:
        try:
            twitter.append(lnk)
        except:
            twitter.append("")
    elif "facebook" in lnk:
        try:
            facebook.append(lnk)
        except:
            facebook.append("")

预期输出:

linkedin = ['adsd%linkedin.comhasdhu','vsdd%linkedin.comfsadfs','fvsdlinkedin.comsdfsf']
twitter = ['dfsdftwitter.comdsddf', '345r3ftwitter.comwer', 'wtwtwitter.comy4w4y']
facebook = ['sahasbfacebook.comdcs', 'sdfsdfsfacebook.comsfsdf', 'sdfefacebook.comswwert']

【问题讨论】:

  • lnk 始终是字符串的列表,其中没有一个只是这些服务之一的名称。
  • 你认为append为什么会失败?

标签: python-3.x list append


【解决方案1】:

这是因为您的原始数据集是列表列表。如果您使用调试器单步执行您的代码,您会看到 lnk 是一个列表,而不是我认为您期望的字符串。所以你的 if 条件永远不会被满足,并且没有附加任何内容。

您还可以通过以下方式更简洁地做到这一点:

lnks = [['adsd%linkedin.comhasdhu', 'sahasbfacebook.comdcs', 'dfsdftwitter.comdsddf'],
['vsdd%linkedin.comfsadfs', 'sdfsdfsfacebook.comsfsdf', '345r3ftwitter.comwer'],
['fvsdlinkedin.comsdfsf', 'sdfefacebook.comswwert', 'wtwtwitter.comy4w4y']]

linkedin = [[a for a in b if 'linkedin' in a][0] for b in lnks]
twitter = [[a for a in b if 'twitter' in a][0] for b in lnks]
facebook = [[a for a in b if 'facebook' in a][0] for b in lnks]

print(f'Linkedin: {linkedin}')
print(f'Twitter: {twitter}')
print(f'Facebook: {facebook}')

# Output
Linkedin: ['adsd%linkedin.comhasdhu', 'vsdd%linkedin.comfsadfs', 'fvsdlinkedin.comsdfsf']
Twitter: ['dfsdftwitter.comdsddf', '345r3ftwitter.comwer', 'wtwtwitter.comy4w4y']
Facebook: ['sahasbfacebook.comdcs', 'sdfsdfsfacebook.comsfsdf', 'sdfefacebook.comswwert']

有时带有条件的嵌套内联 for 循环可能看起来令人困惑,但它会像这样分解:

lnks = list of lists
b = list
a = string
# we specify [0] so that we end up returning 1 list populated with strings, and not another list of lists.

【讨论】:

    【解决方案2】:

    如果它们总是按这个顺序排列,您可以使用zip

    lnks = [['adsd%linkedin.comhasdhu', 'sahasbfacebook.comdcs', 'dfsdftwitter.comdsddf'],
    ['vsdd%linkedin.comfsadfs', 'sdfsdfsfacebook.comsfsdf', '345r3ftwitter.comwer'],
    ['fvsdlinkedin.comsdfsf', 'sdfefacebook.comswwert', 'wtwtwitter.comy4w4y']]
    
    linkedin, twitter, facebook = list(zip(*lnks))
    

    输出如下:

    print(linkedin, twitter, facebook, sep="\n\n")
    
    
    ('adsd%linkedin.comhasdhu', 'vsdd%linkedin.comfsadfs', 'fvsdlinkedin.comsdfsf')
    
    ('sahasbfacebook.comdcs', 'sdfsdfsfacebook.comsfsdf', 'sdfefacebook.comswwert')
    
    ('dfsdftwitter.comdsddf', '345r3ftwitter.comwer', 'wtwtwitter.comy4w4y')
    

    【讨论】:

      【解决方案3】:
      linkedin = []
      twitter = []
      facebook = []
      
      for lnk in lnks:
          for lnk2 in lnk:
              if "linkedin" in lnk2:
                  try:
                      linkedin.append(lnk2)
                  except:
                      linkedin.append("")
              elif "twitter" in lnk2:
                  try:
                      twitter.append(lnk2)
                  except:
                      twitter.append("")
              elif "facebook" in lnk2:
                  try:
                      facebook.append(lnk2)
                  except:
                      facebook.append("")
      

      这应该得到所需的输出

      【讨论】:

        猜你喜欢
        • 2017-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-15
        • 2017-05-10
        • 1970-01-01
        • 1970-01-01
        • 2015-12-23
        相关资源
        最近更新 更多