如何从列表中的列表中过滤出字符串并附加到新列表

How to filter string out from a list inside a list and append to a new list

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

我的清单:

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']

因为你原来的数据集是list of list。如果您使用调试器单步执行代码,您将看到 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.
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("")

这应该得到所需的输出

如果他们总是按那个顺序,你可以用 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')