用于用户输入的循环矩阵的Python

时间:2014-04-30 19:11:02

标签: python arrays matrix

所以我一直在寻找Overflow几天来解决我正在处理的问题。我理解社区努力遏制家庭作业问题,但我很难过并且想学习这个概念并继续学习更多编程。

在Python中我正在开发一个矩阵或二维数组。

以下是用户对Array的编程要求,并将值与数组值进行比较:

然后要求用户输入其中一个用户的名字和姓氏 在矩阵中,然后打印相应的信息(整行) 找到的人;如果没有找到,请打印'用户未找到!'

这是我到目前为止在该阵列上的内容。

rows = 5
cols = 7
names_matrix = ([['lname', 'fname', 'city', 'state', 'zipcode'],
                 ['Zdolfalos', 'Johnson', 'Terrell', 'Wilson', 'Key', 'Smith',     
                  'Alfonso'], 
                 ['Fred', 'Malcom', 'Monkey', 'Wilson', 'LeDoor', 'Jim Bob', 'Ralph'],
                 ['Charlotte', 'Monroe', 'Broken Pine', 'Hogwart', 'Spot in Road',  
                  'Denver','Gastonia'], 
                 ['NC', 'NC', 'SC', 'VA', 'AL', 'NC', 'NC' ],
                 ['28210', '28337', '28974', '27457', '36827', '28037', '28559'] ])

print names_matrix

#Create a Boolean variable flag.
found = False

#Create a variable to use as a loop counter.
index = 0

#Get the strings to search for.

for in names_matrix:  #Having problems here with what goes here in For In Loop
    userFirstName = raw_input('What is the user first name?')
    userLastName =  raw_input('What is the user last name?')

    if userFirstName == names_matrix [1] and userLastName == names_matrix [0]:
        print('')
    #I want to print the Matrix value from the user input
    else
        print('User Not Found!')
# nested find columns
# https://stackoverflow.com/questions/7845165/how-to-take-input-in-an-array-python

我是python和编程的新手,并且已经在书中看到他们是如何用带有false和索引的While循环创建的。我也很难理解通过值和参考的传递。

# Get the string to search for.
searchValue = raw_input('Enter a name to search for in the list: ')
# Step through the list searching for the
# specified name.
while found == False and index < len(names):
    if names[index] == searchValue:
        found = True
    else:
        index = index + 1
# Display the search results.
if found:
    print 'That name was found in element ' + str(index + 1)
else:
    print 'That name was not found in the list.'

我想知道如何使用For In Range Loop来做到这一点。它可能是一个嵌套循环,这些更棘手。

我不相信我在For In范围循环的编码开始时需要布尔标志或索引部分。到目前为止,我只是展示了我的进展,并试图让这个计划更好地运作。

我研究了For In Range的以下有用链接但却感到难过。

For In input in an Array

Array For In

Testing User Input in Array

Python If Else Nested Statements

我们还没有看过Class和Objects,并确实看到了如何做到这一点,我们也没有过去numpy并尝试使用import numpy并且遇到了一些问题,因为我也是numpy的新手。我正在阅读Think with a CS with Python作为课程的额外帮助以及学习Python的艰难之路。

感谢您的时间。

3 个答案:

答案 0 :(得分:2)

for循环迭代的正确语法是:

for x in iterable_object:
    # do something with each x

在英语中,请将iterable_object中的每个项目称为x,并执行一些涉及x的代码。

表示range个对象:

for i in range(0,10,1):
    print i 

这将打印来自0-9的数字,即i将具有值0并且会增加第三个参数1,直到它具有值{{1}并且不会重新进入循环,这意味着最后打印的值将为10

Python允许对此进行一些简写调用:

9

做同样的事情。当提供一个参数时,它被解释为上限。

参考:range()

在您的情况下,您有这些数据:

for i in range(10):
    print i

您可能希望按列排列信息并忽略标题?

names_matrix = ([['lname', 'fname', 'city', 'state', 'zipcode'],
             ['Zdolfalos', 'Johnson', 'Terrell', 'Wilson', 'Key', 'Smith',     
              'Alfonso'], 
             ['Fred', 'Malcom', 'Monkey', 'Wilson', 'LeDoor', 'Jim Bob', 'Ralph'],
             ['Charlotte', 'Monroe', 'Broken Pine', 'Hogwart', 'Spot in Road',  
              'Denver','Gastonia'], 
             ['NC', 'NC', 'SC', 'VA', 'AL', 'NC', 'NC' ],
             ['28210', '28337', '28974', '27457', '36827', '28037', '28559'] ])

这意味着您希望迭代列表中第二个对象iteration 1 - Zdolfalos, Fred, Charlotte, NC, 28210 iteration 2 - Johnson, Malcom, Monroe, NC, 28337 etc ... 的大小。

names_matrix[1]

会给你:

L = len(names_matrix[1])
print names_matrix[0][0],names_matrix[0][2],names_matrix[0][2],names_matrix[0][3],names_matrix[0][4]
for i in range(L):
    print names_matrix[1][i],names_matrix[2][i],names_matrix[3][i],names_matrix[4][i],names_matrix[5][i]

您似乎正在尝试搜索数据中的某人。我会说在循环之前执行用户输入,然后比较上面执行的索引的轻微更改。

请注意,我发现您的数据以相当奇怪的方式排列。我喜欢把它构造成更有意义:

lname fname city state zipcode
Zdolfalos Fred Charlotte NC 28210
Johnson Malcom Monroe NC 28337
Terrell Monkey Broken Pine SC 28974
Wilson Wilson Hogwart VA 27457
Key LeDoor Spot in Road AL 36827
Smith Jim Bob Denver NC 28037
Alfonso Ralph Gastonia NC 28559

使迭代变得相当简单,以迭代您的条目:

names_matrix = (
   [['lname',     'fname',   'city', 'state', 'zipcode'],               
    ['Zdolfalos', 'Fred',    'Charlotte','NC','28210'],
    ['Malcom',    'Johnson', 'Monroe', 'NC', '28337',],
    ['Monkey',    'Terrell', 'Broken Pine', 'SC','28974',],
    # ...etc...
   ] 

python是它的真棒,为这种转换提供了非常快速和简单的操作:

for user in names_matrix[1:]: # [1:] means take the list from the 1st element to the end, noted by the lack of a number after the colon (on a 0 based index)
    print user

在这种情况下,zip函数告诉python采用矩阵,不包括作为标题的第一个条目。

names_matrix = zip(*names_matrix[1:])

按每个条目(即您的类别

)对其进行上传
([['lname', 'fname', 'city', 'state', 'zipcode'],
             ['Zdolfalos', 'Johnson', 'Terrell', 'Wilson', 'Key', 'Smith',     
              'Alfonso'], 
             ['Fred', 'Malcom', 'Monkey', 'Wilson', 'LeDoor', 'Jim Bob', 'Ralph'],
             ['Charlotte', 'Monroe', 'Broken Pine', 'Hogwart', 'Spot in Road',  
              'Denver','Gastonia'], 
             ['NC', 'NC', 'SC', 'VA', 'AL', 'NC', 'NC' ],
             ['28210', '28337', '28974', '27457', '36827', '28037', '28559'] ])

并将这些列表中的每个列表按其索引配对到zip( ['Zdolfalos', 'Johnson', 'Terrell', 'Wilson', 'Key', 'Smith','Alfonso'], ['Fred', 'Malcom', 'Monkey', 'Wilson', 'LeDoor', 'Jim Bob', 'Ralph'], ['Charlotte', 'Monroe', 'Broken Pine', 'Hogwart', 'Spot in Road','Denver','Gastonia'], ['NC', 'NC', 'SC', 'VA', 'AL', 'NC', 'NC' ], ['28210', '28337', '28974', '27457', '36827', '28037', '28559'] ) s:

tuple

现在,您可以遍历用户,而不必处理当前设置所需的更复杂的索引。

如果您希望将原始数据保留为当前格式的原始数据,这可以作为易于使用的临时步骤来完成。

当然,如果你不想改变数据,你仍然可以这样做。

[ ('Zdolfalos', 'Fred', 'Charlotte', 'NC', '28210'),
  ('Johnson', 'Malcom', 'Monroe', 'NC', '28337'),
  ('Terrell', 'Monkey', 'Broken Pine', 'SC', '28974'),
# ... etc ...
]

这种格式可能会为您提供一些如何实现您所要求的想法

答案 1 :(得分:1)

names_matrix的布局方式与其中的第一个列表不符。 names_matrix中的第一个列表是['lname', 'fname', 'city', 'state', 'zipcode'],这使得人们认为其中的后续列表遵循该顺序。

names_matrix中的后续列表,其中是姓氏列表,后跟名字列表,后跟城市列表,后跟状态列表,后跟邮政编码列表。

我们可以使用names_matrix将其转换为关注标题(zip()中的第一个列表),如:

fixed_names = zip(*names_matrix[1:])

这会将fixed_names的值设为:

[('Zdolfalos', 'Fred', 'Charlotte', 'NC', '28210'), ('Johnson', 'Malcom', 'Monroe', 'NC', '28337'), ('Terrell', 'Monkey', 'Broken Pine', 'SC', '28974'), ('Wilson', 'Wilson', 'Hogwart', 'VA', '27457'), ('Key', 'LeDoor', 'Spot in Road', 'AL', '36827'), ('Smith', 'Jim Bob', 'Denver', 'NC', '28037'), ('Alfonso', 'Ralph', 'Gastonia', 'NC', '28559')]

现在获取用户输入。无需for循环来获取用户输入:

userFirstName = raw_input('What is the user first name?')
userLastName =  raw_input('What is the user last name?')

现在遍历fixed_names并查看userFirstNameuserLastName是否在其中。如果是这样输出整行:

found = False
for row in fixed_names:
    if userLastName in row and userFirstName in row:
        found = True
        print(list(row))
        break
if not found:
    print('User Not Found!')

<强>演示:

>>> names_matrix = ([['lname', 'fname', 'city', 'state', 'zipcode'],
...              ['Zdolfalos', 'Johnson', 'Terrell', 'Wilson', 'Key', 'Smith',
...               'Alfonso'],
...              ['Fred', 'Malcom', 'Monkey', 'Wilson', 'LeDoor', 'Jim Bob', 'Ralph'],
...              ['Charlotte', 'Monroe', 'Broken Pine', 'Hogwart', 'Spot in Road',
...               'Denver','Gastonia'],
...              ['NC', 'NC', 'SC', 'VA', 'AL', 'NC', 'NC' ],
...              ['28210', '28337', '28974', '27457', '36827', '28037', '28559'] ])
>>> fixed_names = zip(*names_matrix[1:])
[('Zdolfalos', 'Fred', 'Charlotte', 'NC', '28210'), ('Johnson', 'Malcom', 'Monroe', 'NC', '28337'), ('Terrell', 'Monkey', 'Broken Pine', 'SC', '28974'), ('Wilson', 'Wilson', 'Hogwart', 'VA', '27457'), ('Key', 'LeDoor', 'Spot in Road', 'AL', '36827'), ('Smith', 'Jim Bob', 'Denver', 'NC', '28037'), ('Alfonso', 'Ralph', 'Gastonia', 'NC', '28559')]
>>> userFirstName = 'Fred'
>>> userLastName = 'Zdolfalos'
>>> for row in fixed_names:
...     if userLastName in row and userFirstName in row:
...         print(list(row))
...     else:
...         print('User Not Found!')
...
['Zdolfalos', 'Fred', 'Charlotte', 'NC', '28210']

答案 2 :(得分:0)

您的names_matrix是一个列表列表 - “names_matrix”中的每个项目都是一个列表。

for thing in names_matrix:
    print thing

## ['lname', 'fname', 'city', 'state', 'zipcode']
## ['Zdolfalos', 'Johnson', 'Terrell', 'Wilson', 'Key', 'Smith', 'Alfonso']
## ['Fred', 'Malcom', 'Monkey', 'Wilson', 'LeDoor', 'Jim Bob', 'Ralph']
## ['Charlotte', 'Monroe', 'Broken Pine', 'Hogwart', 'Spot in Road', 'Denver', 'Gastonia']
## ['NC', 'NC', 'SC', 'VA', 'AL', 'NC', 'NC']
## ['28210', '28337', '28974', '27457', '36827', '28037', '28559']
如果你还需要项目的索引,那么

```enumerate()``很有用:

for idx, thing in enumerate(names_matrix):
    print ' ', idx, ':', thing

##  0 : ['lname', 'fname', 'city', 'state', 'zipcode']
##  1 : ['Zdolfalos', 'Johnson', 'Terrell', 'Wilson', 'Key', 'Smith', 'Alfonso']
##  2 : ['Fred', 'Malcom', 'Monkey', 'Wilson', 'LeDoor', 'Jim Bob', 'Ralph']
##  3 : ['Charlotte', 'Monroe', 'Broken Pine', 'Hogwart', 'Spot in Road', 'Denver', 'Gastonia']
##  4 : ['NC', 'NC', 'SC', 'VA', 'AL', 'NC', 'NC']
##  5 : ['28210', '28337', '28974', '27457', '36827', '28037', '28559']

尝试使用子列表中每个项目的索引:

for idx, thing in enumerate(names_matrix):
    for ndx, item in enumerate(thing):
        print ' ', idx, ':', ndx, ':', item

zip()也非常方便,它预先形成类似于换位的操作。在下文中,names_matrix之前的星号解包 子列表

for idx, thing in enumerate(zip(*names_matrix)):
    print ' ', idx, ':', thing[1:]

##  0 : ('Zdolfalos', 'Fred', 'Charlotte', 'NC', '28210')
##  1 : ('Johnson', 'Malcom', 'Monroe', 'NC', '28337')
##  2 : ('Terrell', 'Monkey', 'Broken Pine', 'SC', '28974')
##  3 : ('Wilson', 'Wilson', 'Hogwart', 'VA', '27457')
##  4 : ('Key', 'LeDoor', 'Spot in Road', 'AL', '36827')