IndexError: list index out of range python 3.4 - python

Trying to run this code :
sorted_by_name = sorted(sort_array,key=lambda x:x[0]))
I get:
IndexError: list index out of range
How do I resolve this?
Thanks

Well one of element in the sort_array should be either empty or null string. See the below examples
Example #1:
sort_array = ['abc', 'acd', 'abcd', '']
sort_array
['abc', 'acd', 'abcd', '']
sorted(sort_array, key=lambda student: student[0])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <lambda>
IndexError: string index out of range
For example #2, i will take sort_array as list of lists, which matches more to your example of sorted_by_name
>>> student_tuples = [
... ['john', 'A', 15],
... []
... ]
>>> sorted_by_name = sorted(student_tuples,key=lambda x:x[0])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <lambda>
IndexError: list index out of range
Hence I request you to please check your input sort_array once, if it has any empty lists

That means that at least one thing in your list is empty so doesn't have a first element. The fix is simple, don't pass a key:
sorted_by_name = sorted(sort_array)
The default implementation of sorted already tries the first item, then the second item, the third item, etc. When you pass it a key, it first tries your key, the first item. If it finds that two are the same, it does its own check. It checks the first item (again), the second item, the third item, etc. In other words, both are the same except that supplying a key might mean that the first item is checked twice, and of course the default implementation doesn't error on an empty list.

Related

Update Python Dictionary with Tuple of Strings to set (key, value) fails

dict.update([other]) says
Update the dictionary with the key/value pairs from other, overwriting existing keys. Return None.
update() accepts either another dictionary object or an iterable of key/value pairs (as tuples or other iterables of length two). If keyword arguments are specified, the dictionary is then updated with those key/value pairs: d.update(red=1, blue=2).
But
>>> {}.update( ("key", "value") )
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: dictionary update sequence element #0 has length 3; 2 is required
So why does Python apparently try to use the first string of the tuple?
The argument needs to be an iterable of tuples (or other iterables of length two), e.g. a list
>>> d = {}
>>> d.update([("key", "value")])
>>> d
{'key': 'value'}
or a tuple, however this fails:
>>> d = {}
>>> d.update((("key", "value")))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: dictionary update sequence element #0 has length 3; 2 is required
The Python documentation on tuple again solves this mystery:
Note that it is actually the comma which makes a tuple, not the parentheses. The parentheses are optional, except in the empty tuple case, or when they are needed to avoid syntactic ambiguity.
I.e. (None) is not a tuple at all, but (None,) is:
>>> type( (None,) )
<class 'tuple'>
So this works:
>>> d = {}
>>> d.update((("key", "value"),))
>>> d
{'key': 'value'}
>>>
You can't omit the parentheses because
>>> d = {}
>>> d.update(("key", "value"),)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: dictionary update sequence element #0 has length 3; 2 is required
that would be said syntactic ambiguity (comma is function argument separator).

Python - List Index Out Of Range In For Loop

I'm fairly new to python and I'm currently working on a program that will encrypt and decrypt strings. As part of it, I need the individual letters of the string to each be added to an empty list; for example, the string 'hello' would be entered into a list list like so:
['h','e','l','l','o']
The part of the code that is giving me this error can be found below. Thanks.
emptyList=[]
message=input("What Would You Like To Encrypt?\n")
messageLength=len(message)
for count in range(0,messageLength):
emptyList=[]
emptyList[count].append(message[count])
You are trying to address indices in an empty list:
>>> lst = []
>>> lst[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
>>> lst[0] = 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
If you wanted to add elements to a list, just use list.append() directly on the list object itself to create more indices; don't create new empty lists each time:
emptyList=[]
messageLength=len(message)
for count in range(0,messageLength):
emptyList.append(message[count])
Not that you need to be this elaborate, the following is enough:
emptyList = list(message)
list() takes any iterable and adds all the elements of that iterable to a list. Since a string is iterable, producing all the characters in that string, calling list() on a string creates a list of those characters:
>>> list('hello')
['h', 'e', 'l', 'l', 'o']
Basically you want just read from the input and then output a list
Python 2.7
message=raw_input("What Would You Like To Encrypt?\n")
print list(message)
Python 3.X
message=input("What Would You Like To Encrypt?\n")
print(list(message))
Output
If you input Hello
['H', 'e', 'l', 'l', 'o']

Python how to combine a string and list to a tuple

I have a string and a list
a=100
b=["abc","def"]
How do I combine these to a tuple, that looks like (abc, 100), (def, 100)? I tried
>>> for i in file:
... tuple(file, uid)
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
TypeError: tuple() takes at most 1 argument (2 given)
a=100
b=["abc","def"]
print [(i,a) for i in b]
You can do this through simple list comprehension
as the traceback said, tuple takes 1 argument, in your code, just change tuple(file, uid) to tuple([file, uid]). That is to say, tuple takes one argument which is iterable

convert a list of strings to a list of numbers?

I would like to convert a list of following strings into integers:
>>> tokens
['2', '6']
>>> int(tokens)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: int() argument must be a string or a number, not 'list'
Other than writing a for loop to convert each member of the list tokens, is there a better way to do that? Thanks!
Just use list comprehension:
[int(t) for t in tokens]
Alternatively map the int over the list
map(int, tokens)
However map is changed in python3, so it creates an instance of the map and you would have to cast that back into a list if you want the list.
i = iter(list)
while i.next != None:
print int(i.next())

"Can only iterable" Python error

Hello my fellow programmers.
I am a fairly new programmer, and now I am facing a great predicament. I am getting the error:
can only assign an iterable
Firstly I don't know what that means.
Secondly I will leave my code for you professionals to critique it:
def num_top(int_lis):
duplic_int_lis = int_lis
int_firs= duplic_int_lis [0]
int_lis[:] = duplic_int_lis [int_firs]
Basically I am trying to find the [0] element in the list and then using that int as an index position to find the integer at that index position.
int_lis[:] = duplic_int_lis [int_firs] means assign all the items of duplic_int_lis [int_firs] to int_lis, so it expects you to pass an iterable/iterator on the RHS.
But in your case you're passing it an non-iterable, which is incorrect:
>>> lis = range(10)
>>> lis[:] = range(5)
>>> lis #all items of `lis` replaced with range(5)
[0, 1, 2, 3, 4]
>>> lis[:] = 5 #Non-iterable will raise an error.
Traceback (most recent call last):
File "<ipython-input-77-0704f8a4410d>", line 1, in <module>
lis[:] = 5
TypeError: can only assign an iterable
>>> lis[:] = 'foobar' #works for any iterable/iterator
>>> lis
['f', 'o', 'o', 'b', 'a', 'r']
As you cannot iterate over an integer, hence the error.
>>> for x in 1: pass
Traceback (most recent call last):
File "<ipython-input-84-416802313c58>", line 1, in <module>
for x in 1:pass
TypeError: 'int' object is not iterable
The RHS of a slice-assignment must be an iterable, not a scalar. Consider slice-deleting and then appending instead.
An iterable is a thing with multiple items that you can iterate through (for example: take the 1st value do something, then the 2nd do something, etc...) Lists, dictionaries, tuples, strings have several items in them and can be used as iterables. As a counterexample: number types don't qualify as iterable.
Remember that computers count from #0 so: if you want the first value of a list you can use
my_list[0]
before you go further I would suggest watching this video about looping. https://www.youtube.com/watch?v=EnSu9hHGq5o

Categories

Resources