Python 基于字符串匹配打印列表的二维矩阵

Python 基于字符串匹配打印列表的二维矩阵,python,python-3.x,pandas,machine-learning,Python,Python 3.x,Pandas,Machine Learning,我有一个列表,我想根据所选的每个特征在网格中表示 breakfast = [['Apple,Banana'],['Apple,Yogurt'],['Banana,Oatmeal']] 所需网格: Index: Apple Banana Yogurt Oatmeal 1 "x" "x" " " " " 2 "x" " " "x" " " 3 " " "x"

我有一个列表,我想根据所选的每个特征在网格中表示

breakfast = [['Apple,Banana'],['Apple,Yogurt'],['Banana,Oatmeal']]
所需网格:

Index:   Apple   Banana   Yogurt   Oatmeal
1         "x"      "x"     " "       " "
2         "x"      " "     "x"       " "
3         " "      "x"     " "       "x"
我认为我需要通过网格使用正则表达式和字符串索引列表,如何做到这一点是我的问题。更好的是,是否有一个python库可以自动执行此操作(如R中的leaps/summary)

这是我目前的代码:

def printMatrix(data):
    header = "Index:\tApple\tBanana\tYogurt\tOatmeal"
    print(header)
    for index, value in enumerate(data):
        if str(value).find('Apple') != -1:
            print(index,"\t\'X'", end='')
        else:
            print(index,"\t\' '",end='')
        if str(value).find('Banana') != -1:
            print("\t\'X'", end='')
        else:
            print("\t\' '",end='')
        if str(value).find('Yogurt') != -1:
            print("\t\'X'", end='')
        else:
            print("\t\' '")
        if str(value).find('Oatmeal') != -1:
            print("\t\'X'")
结果是准确的,但效率感觉很差。

集合、列表理解和三元条件加上
Pandas
如果你既想要漂亮,又想要蟒蛇,这里有一个方法

import pandas as pd
breakfast = [['Apple,Banana'],['Apple,Yogurt'],['Banana,Oatmeal']]
breakfast = [i[0].split(',') for i in breakfast]


columns=list(set([j for i in breakfast for j in i]))
columns.sort()
values = [[1 if j in i else 0 for j in columns]for i in breakfast]
df = pd.DataFrame(values, columns=columns)
print(df) 

设置、列出理解和三元条件加上
Pandas
如果你既想要漂亮,又想要蟒蛇,这里有一个方法

import pandas as pd
breakfast = [['Apple,Banana'],['Apple,Yogurt'],['Banana,Oatmeal']]
breakfast = [i[0].split(',') for i in breakfast]


columns=list(set([j for i in breakfast for j in i]))
columns.sort()
values = [[1 if j in i else 0 for j in columns]for i in breakfast]
df = pd.DataFrame(values, columns=columns)
print(df) 


您可以使用纯熊猫解决方案-首先创建
系列
,然后通过
str[0]
选择列表的第一个值,最后:

但如果可能的话,多列表值解决方案是先使用
list comprehension
join
,然后使用
str.get\u dummies

breakfast = [['Apple,Banana', 'Apple,Yogurt'],['Apple,Yogurt'],['Banana,Oatmeal']]

df = pd.Series([','.join(x) for x in breakfast]).str.get_dummies(',')
print (df)
   Apple  Banana  Oatmeal  Yogurt
0      1       1        0       1
1      1       0        0       1
2      0       1        1       0 

您可以使用纯熊猫解决方案-首先创建
系列
,然后通过
str[0]
选择列表的第一个值,最后:

但如果可能的话,多列表值解决方案是先使用
list comprehension
join
,然后使用
str.get\u dummies

breakfast = [['Apple,Banana', 'Apple,Yogurt'],['Apple,Yogurt'],['Banana,Oatmeal']]

df = pd.Series([','.join(x) for x in breakfast]).str.get_dummies(',')
print (df)
   Apple  Banana  Oatmeal  Yogurt
0      1       1        0       1
1      1       0        0       1
2      0       1        1       0 

到目前为止,您尝试了什么?基本上是每个类别的一系列if-else语句。让我印象深刻的是,有一种更像python的方法可以做到这一点。到目前为止,您尝试了什么?基本上是每个类别的一系列if-else语句。让我印象深刻的是,有一种更具python风格的方法可以做到这一点。我用我当前的代码更新了我的帖子。我正在寻找一种方法,如果可能的话,它可以“漂亮地打印”到所需的输出。然后你可以寻找
pandas
,它不仅可以提供漂亮的打印,还可以提供其他惊人的重塑和分组功能。我应该更清楚地说,内部列表元素由一个由逗号分隔的字符串组成(列表可以有2个以上的元素)。这会断开列标题。正在更新OP@Shawn更新。您可以使用
string.split(',')
进行列表理解。我用当前代码更新了我的帖子。我正在寻找一种“漂亮打印”的方法如果可能的话,您可以寻找
pandas
,它不仅提供漂亮的打印效果,还提供其他惊人的整形和分组功能。我应该更清楚,内部列表元素由一个由逗号分隔的字符串组成(列表可以有两个以上的元素)。这将断开列标题。正在更新OP@Shawn更新。您可以使用
string.split(',')
进行列表理解。惊讶于我的代码与
get_dummies()
!@KenT的源代码如此相似-您可以检查:)惊讶于我的代码与
get_dummies()
的源代码如此相似@肯特-您可以查看:)