📜  Python|对列表中的输入数据进行分类

📅  最后修改于: 2022-05-13 01:55:28.992000             🧑  作者: Mango

Python|对列表中的输入数据进行分类

Python中的列表是线性容器,用于存储各种数据类型的数据。存储各种数据的能力使列表成为Python中非常独特和重要的数据结构。
创建后,可以根据需要进一步修改列表。因此,它们是“可变的”。
列表在创建并通过在代码部分中定义值时,会生成类似于以下内容的输出:
代码 :

Python3
List =['GeeksForGeeks', 'VenD', 5, 9.2]
print('\n List: ', List)


Python3
# Usual Arithmetic Operations on 5 and 9.2:
List =['GeeksForGeeks', 'VenD', 5, 9.2]
print('\n List[2]+2, Answer: ', end ='')
print(List[List.index(5)]+2)
 
print('\n\n List[3]+8.2, Answer: ', end ='')
print(List[List.index(9.2)]+8.2)


Python3
# String Concatenation Operation
# List:  ['GeeksForGeeks', 'VenD', 5, 9.2]
# Concatenating List[0] and List[1]
List =  ['GeeksForGeeks', 'VenD', 5, 9.2]
print(List[0]+' '+List[1])


Python3
# All Resultant Elements of List2 will be of string type
 
list2 =[]  # This is the list which will contain elements as an input from the user
 
element_count = int(input('\n Enter Number of Elements you wish to enter: '))
 
for i in range(element_count):
    element = input(f'\n Enter Element {i + 1} : ')
    list2.append(element)
     
print("\n List 2 : ", list2)


Python3
import re
 
def checkInt(string):
    string_to_integer = re.compile(r'\d+')
    if len(string_to_integer.findall(string)) != 0:
        if len(string_to_integer.findall(string)[0])== len(string):
            return 1
        else:
            return 0
    else:
        return 0
     
def checkFloat(string):
    string_to_float = re.compile(r'\d*.\d*')
    if len(string_to_float.findall(string)) != 0:
        if len(string_to_float.findall(string)[0])== len(string):
            return 1
        else:
            return 0
    else:
        return 0
     
List2 =[]
element_count = int(input('\n Enter number of elements : '))
 
for i in range(element_count):
    input_element = input(f'\n Enter Element {i + 1}: ')
 
    if checkInt(input_element):
        input_element = int(input_element)
        List2.append(input_element)
         
    elif checkFloat(input_element):
        input_element = float(input_element)
        List2.append(input_element)
         
    else:
        List2.append(input_element)
         
print(List2)


输出:

List:  ['GeeksForGeeks', 'VenD', 5, 9.2]

在上图中,定义的列表是整数和字符串值的组合。解释器将“GeeksForGeeks”和“VenD”隐式解释为字符串值,而 5 和 9.2 分别解释为整数和浮点值。我们可以对整数和浮点值执行通常的算术运算,如下所示。
代码 :

Python3

# Usual Arithmetic Operations on 5 and 9.2:
List =['GeeksForGeeks', 'VenD', 5, 9.2]
print('\n List[2]+2, Answer: ', end ='')
print(List[List.index(5)]+2)
 
print('\n\n List[3]+8.2, Answer: ', end ='')
print(List[List.index(9.2)]+8.2)

输出:

List[2]+2, Answer: 7
 List[3]+8.2, Answer: 17.4

此外,可以对相应的字符串执行字符串连接等特定于字符串的操作:
代码 :

Python3

# String Concatenation Operation
# List:  ['GeeksForGeeks', 'VenD', 5, 9.2]
# Concatenating List[0] and List[1]
List =  ['GeeksForGeeks', 'VenD', 5, 9.2]
print(List[0]+' '+List[1])

但是,由于我们知道列表包含各种数据类型的项目,这些项目可能是以下类型:字符串、整数、浮点数、元组、字典,甚至可能是列表本身(列表列表),如果您是根据用户输入生成列表。例如,考虑下面的例子:
代码 :

Python3

# All Resultant Elements of List2 will be of string type
 
list2 =[]  # This is the list which will contain elements as an input from the user
 
element_count = int(input('\n Enter Number of Elements you wish to enter: '))
 
for i in range(element_count):
    element = input(f'\n Enter Element {i + 1} : ')
    list2.append(element)
     
print("\n List 2 : ", list2)

输出:

Enter Number of Elements you wish to enter: 4

 Enter Element 1 : GeeksForGeeks

 Enter Element 2 : VenD

 Enter Element 3 : 5

 Enter Element 4 : 9.2

 List 2 :  ['GeeksForGeeks', 'VenD', '5', '9.2']

您可能会注意到,作为用户输入的结果生成的 List2 现在仅包含字符串数据类型的值。此外,数字元素现在已经失去了进行算术运算的能力,因为它们是字符串数据类型。这种行为直接与列表的通用行为相矛盾。
作为程序员,我们有必要处理用户数据并以适当的格式存储它,以便对目标数据集的操作和操作变得高效。
在这种方法中,我们将从用户获取的数据分为三个部分,即整数、字符串和浮点数。为此,我们使用一小段代码来执行相应的类型转换操作。
一种克服建议限制的技术:

代码 :

Python3

import re
 
def checkInt(string):
    string_to_integer = re.compile(r'\d+')
    if len(string_to_integer.findall(string)) != 0:
        if len(string_to_integer.findall(string)[0])== len(string):
            return 1
        else:
            return 0
    else:
        return 0
     
def checkFloat(string):
    string_to_float = re.compile(r'\d*.\d*')
    if len(string_to_float.findall(string)) != 0:
        if len(string_to_float.findall(string)[0])== len(string):
            return 1
        else:
            return 0
    else:
        return 0
     
List2 =[]
element_count = int(input('\n Enter number of elements : '))
 
for i in range(element_count):
    input_element = input(f'\n Enter Element {i + 1}: ')
 
    if checkInt(input_element):
        input_element = int(input_element)
        List2.append(input_element)
         
    elif checkFloat(input_element):
        input_element = float(input_element)
        List2.append(input_element)
         
    else:
        List2.append(input_element)
         
print(List2)

输出:

Enter number of elements : 4

 Enter Element 1: GeeksForGeeks

 Enter Element 2: VenD

 Enter Element 3: 5

 Enter Element 4: 9.2
['GeeksForGeeks', 'VenD', 5, 9.2]

上述技术本质上是一种算法,它使用正则表达式库和一种算法来分析被插入元素的数据类型。成功分析数据模式后,我们接着进行类型转换。
例如,考虑以下情况:

  1. Case1:字符串中的所有值都是数字。用户输入是 7834,正则表达式函数分析给定数据并确定所有值都是 0 到 9 之间的数字,因此字符串“7834”被转换为等效的整数值,然后作为整数附加到列表中。
    用于整数识别的表达式:r'\d+'

  1. Case2:字符串表达式包含表示浮点数的元素。浮点值是在句号 ('.') 之前或之后的数字模式上标识的。例如:567.、.056、6.7 等。
    用于浮点值识别的表达式:r'\d*.\d*'
  2. Case3:字符串输入也包含字符、特殊字符和数值。在这种情况下,数据元素被概括为字符串值。不需要特殊的正则表达式,因为给定的表达式在分类为整数或浮点值时将返回 false。
    例如:'155B,贝克街! '、'12B72C_?'、'我是特工 007'、'_GeeksForGeeks_'等。

结论:然而,这种方法只是类型转换值和在将原始数据存储到列表中之前处理原始数据的一个小原型。它肯定提供了一个富有成效的结果,克服了对列表输入的拟议限制。此外,随着正则表达式的先进应用和算法的一些改进,可以对元组、字典等更多形式的数据进行相应的分析和存储。

动态类型转换的优点:

  • 由于数据以适当的格式存储,因此可以对其执行各种“特定于类型”的操作。例如:字符串的连接,数值的加法,减法,乘法以及对相应数据类型的各种其他操作。
  • 类型转换阶段发生在存储数据时。因此,程序员不必担心在对数据集执行操作时发生的类型错误。

动态类型转换的限制:

  • 一些不一定需要类型转换的数据元素会经历这个过程,导致不必要的计算。
  • 每次插入新元素时,多次条件检查和函数调用都会导致内存浪费。
  • 处理多种类型数据的灵活性可能需要根据开发人员的需要对现有代码进行一些新的添加。